Release 23
git-svn-id: https://svn.code.sf.net/p/synalist/code/trunk@49 7c85be65-684b-0410-a082-b2ed4fbef004
This commit is contained in:
parent
3afdb0701b
commit
df848de345
403
asn1util.pas
403
asn1util.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 001.003.002 |
|
| Project : Delphree - Synapse | 001.003.003 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: support for ASN.1 coding and decoding |
|
| Content: support for ASN.1 coding and decoding |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -26,6 +26,7 @@
|
|||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
{$Q-}
|
{$Q-}
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit ASN1Util;
|
unit ASN1Util;
|
||||||
|
|
||||||
@ -46,204 +47,202 @@ const
|
|||||||
ASN1_TIMETICKS = $43;
|
ASN1_TIMETICKS = $43;
|
||||||
ASN1_OPAQUE = $44;
|
ASN1_OPAQUE = $44;
|
||||||
|
|
||||||
function ASNEncOIDitem(Value: integer): string;
|
function ASNEncOIDItem(Value: Integer): string;
|
||||||
function ASNDecOIDitem(var Start: integer; Buffer: string): integer;
|
function ASNDecOIDItem(var Start: Integer; const Buffer: string): Integer;
|
||||||
function ASNEncLen(Len: integer): string;
|
function ASNEncLen(Len: Integer): string;
|
||||||
function ASNDecLen(var Start: integer; Buffer: string): integer;
|
function ASNDecLen(var Start: Integer; const Buffer: string): Integer;
|
||||||
function ASNEncInt(Value: integer): string;
|
function ASNEncInt(Value: Integer): string;
|
||||||
function ASNEncUInt(Value: integer): string;
|
function ASNEncUInt(Value: Integer): string;
|
||||||
function ASNObject(Data: string; ASNType: integer): string;
|
function ASNObject(const Data: string; ASNType: Integer): string;
|
||||||
function ASNItem(var Start: integer; Buffer: string; var ValueType:integer): string;
|
function ASNItem(var Start: Integer; const Buffer: string;
|
||||||
Function MibToId(mib:string):string;
|
var ValueType: Integer): string;
|
||||||
Function IdToMib(id:string):string;
|
function MibToId(Mib: string): string;
|
||||||
Function IntMibToStr(int:string):string;
|
function IdToMib(const Id: string): string;
|
||||||
|
function IntMibToStr(const Value: string): string;
|
||||||
function IPToID(Host: string): string;
|
function IPToID(Host: string): string;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNEncOIDitem}
|
|
||||||
function ASNEncOIDitem(Value: integer): string;
|
function ASNEncOIDItem(Value: Integer): string;
|
||||||
var
|
var
|
||||||
x,xm:integer;
|
x, xm: Integer;
|
||||||
b:boolean;
|
b: Boolean;
|
||||||
begin
|
begin
|
||||||
x:=value;
|
x := Value;
|
||||||
b:=false;
|
b := False;
|
||||||
result:='';
|
Result := '';
|
||||||
repeat
|
repeat
|
||||||
xm:=x mod 128;
|
xm := x mod 128;
|
||||||
x:=x div 128;
|
x := x div 128;
|
||||||
if b then
|
if b then
|
||||||
xm:=xm or $80;
|
xm := xm or $80;
|
||||||
if x>0
|
if x > 0 then
|
||||||
then b:=true;
|
b := True;
|
||||||
result:=char(xm)+result;
|
Result := Char(xm) + Result;
|
||||||
until x=0;
|
until x = 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNDecOIDitem}
|
|
||||||
function ASNDecOIDitem(var Start: integer; Buffer: string): integer;
|
function ASNDecOIDItem(var Start: Integer; const Buffer: string): Integer;
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
b:boolean;
|
b: Boolean;
|
||||||
begin
|
begin
|
||||||
result:=0;
|
Result := 0;
|
||||||
repeat
|
repeat
|
||||||
result:=result*128;
|
Result := Result * 128;
|
||||||
x := Ord(Buffer[Start]);
|
x := Ord(Buffer[Start]);
|
||||||
inc(start);
|
Inc(Start);
|
||||||
b:=x>$7f;
|
b := x > $7F;
|
||||||
x:=x and $7f;
|
x := x and $7F;
|
||||||
result:=result+x;
|
Result := Result + x;
|
||||||
if not b
|
until not b;
|
||||||
then break;
|
|
||||||
until false
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNEncLen}
|
|
||||||
function ASNEncLen(Len: integer): string;
|
function ASNEncLen(Len: Integer): string;
|
||||||
var
|
var
|
||||||
x, y: integer;
|
x, y: Integer;
|
||||||
begin
|
begin
|
||||||
if (len<$80)
|
if Len < $80 then
|
||||||
then result:=char(len)
|
Result := Char(Len)
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
x:=len;
|
x := Len;
|
||||||
result:='';
|
Result := '';
|
||||||
repeat
|
repeat
|
||||||
y:=x mod 256;
|
y := x mod 256;
|
||||||
x:=x div 256;
|
x := x div 256;
|
||||||
result:=char(y)+result;
|
Result := Char(y) + Result;
|
||||||
until x=0;
|
until x = 0;
|
||||||
y:=length(result);
|
y := Length(Result);
|
||||||
y:=y or $80;
|
y := y or $80;
|
||||||
result:=char(y)+result;
|
Result := Char(y) + Result;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNDecLen}
|
|
||||||
function ASNDecLen(var Start: integer; Buffer: string): integer;
|
function ASNDecLen(var Start: Integer; const Buffer: string): Integer;
|
||||||
var
|
var
|
||||||
x,n: integer;
|
x, n: Integer;
|
||||||
begin
|
begin
|
||||||
x:=Ord(Buffer[Start]);
|
x := Ord(Buffer[Start]);
|
||||||
Inc(Start);
|
Inc(Start);
|
||||||
if (x<$80)
|
if x < $80 then
|
||||||
then Result:=x
|
Result := x
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
result:=0;
|
Result := 0;
|
||||||
x:=x and $7f;
|
x := x and $7F;
|
||||||
for n:=1 to x do
|
for n := 1 to x do
|
||||||
begin
|
begin
|
||||||
result:=result*256;
|
Result := Result * 256;
|
||||||
x:=Ord(Buffer[Start]);
|
x := Ord(Buffer[Start]);
|
||||||
Inc(Start);
|
Inc(Start);
|
||||||
result:=result+x;
|
Result := Result + x;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNEncInt}
|
|
||||||
function ASNEncInt(Value: integer): string;
|
function ASNEncInt(Value: Integer): string;
|
||||||
var
|
var
|
||||||
x,y:cardinal;
|
x, y: Cardinal;
|
||||||
neg:boolean;
|
neg: Boolean;
|
||||||
begin
|
begin
|
||||||
neg:=value<0;
|
neg := Value < 0;
|
||||||
x:=abs(Value);
|
x := Abs(Value);
|
||||||
if neg then
|
if neg then
|
||||||
x:=not (x-1);
|
x := not (x - 1);
|
||||||
result:='';
|
Result := '';
|
||||||
repeat
|
repeat
|
||||||
y:=x mod 256;
|
y := x mod 256;
|
||||||
x:=x div 256;
|
x := x div 256;
|
||||||
result:=char(y)+result;
|
Result := Char(y) + Result;
|
||||||
until x=0;
|
until x = 0;
|
||||||
if (not neg) and (result[1]>#$7F)
|
if (not neg) and (Result[1] > #$7F) then
|
||||||
then result:=#0+result;
|
Result := #0 + Result;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNEncUInt}
|
|
||||||
function ASNEncUInt(Value: integer): string;
|
function ASNEncUInt(Value: Integer): string;
|
||||||
var
|
var
|
||||||
x,y:integer;
|
x, y: Integer;
|
||||||
neg:boolean;
|
neg: Boolean;
|
||||||
begin
|
begin
|
||||||
neg:=value<0;
|
neg := Value < 0;
|
||||||
x:=Value;
|
x := Value;
|
||||||
if neg
|
if neg then
|
||||||
then x:=x and $7FFFFFFF;
|
x := x and $7FFFFFFF;
|
||||||
result:='';
|
Result := '';
|
||||||
repeat
|
repeat
|
||||||
y:=x mod 256;
|
y := x mod 256;
|
||||||
x:=x div 256;
|
x := x div 256;
|
||||||
result:=char(y)+result;
|
Result := Char(y) + Result;
|
||||||
until x=0;
|
until x = 0;
|
||||||
if neg
|
if neg then
|
||||||
then result[1]:=char(ord(result[1]) or $80);
|
Result[1] := Char(Ord(Result[1]) or $80);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNObject}
|
|
||||||
function ASNObject(Data: string; ASNType: integer): string;
|
function ASNObject(const Data: string; ASNType: Integer): string;
|
||||||
begin
|
begin
|
||||||
Result := Char(ASNType) + ASNEncLen(Length(Data)) + Data;
|
Result := Char(ASNType) + ASNEncLen(Length(Data)) + Data;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ASNItem}
|
|
||||||
function ASNItem(var Start: integer; Buffer: string; var ValueType:integer): string;
|
function ASNItem(var Start: Integer; const Buffer: string;
|
||||||
|
var ValueType: Integer): string;
|
||||||
var
|
var
|
||||||
ASNType: integer;
|
ASNType: Integer;
|
||||||
ASNSize: integer;
|
ASNSize: Integer;
|
||||||
y,n: integer;
|
y, n: Integer;
|
||||||
x: byte;
|
x: byte;
|
||||||
s: string;
|
s: string;
|
||||||
c: char;
|
c: char;
|
||||||
neg: boolean;
|
neg: Boolean;
|
||||||
l:integer;
|
l: Integer;
|
||||||
begin
|
begin
|
||||||
Result:='';
|
Result := '';
|
||||||
ValueType:=ASN1_NULL;
|
ValueType := ASN1_NULL;
|
||||||
l:=length(buffer);
|
l := Length(Buffer);
|
||||||
if l<(start+1)
|
if l < (Start + 1) then
|
||||||
then exit;
|
Exit;
|
||||||
ASNType := Ord(Buffer[Start]);
|
ASNType := Ord(Buffer[Start]);
|
||||||
Valuetype:=ASNType;
|
ValueType := ASNType;
|
||||||
Inc(start);
|
Inc(Start);
|
||||||
ASNSize := ASNDecLen(Start, Buffer);
|
ASNSize := ASNDecLen(Start, Buffer);
|
||||||
if (Start+ASNSize-1)>l
|
if (Start + ASNSize - 1) > l then
|
||||||
then exit;
|
Exit;
|
||||||
if ((ASNType and $20) > 0) then
|
if (ASNType and $20) > 0 then
|
||||||
begin
|
Result := '$' + IntToHex(ASNType, 2)
|
||||||
Result := '$' + IntToHex(ASNType, 2);
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
case ASNType of
|
case ASNType of
|
||||||
ASN1_INT:
|
ASN1_INT:
|
||||||
begin
|
begin
|
||||||
y := 0;
|
y := 0;
|
||||||
neg:=false;
|
neg := False;
|
||||||
for n := 1 to ASNSize do
|
for n := 1 to ASNSize do
|
||||||
begin
|
begin
|
||||||
x:=Ord(Buffer[Start]);
|
x := Ord(Buffer[Start]);
|
||||||
if (n=1) and (x>$7F)
|
if (n = 1) and (x > $7F) then
|
||||||
then neg:=true;
|
neg := True;
|
||||||
if neg
|
if neg then
|
||||||
then x:=not x;
|
x := not x;
|
||||||
y := y * 256 + x;
|
y := y * 256 + x;
|
||||||
Inc(Start);
|
Inc(Start);
|
||||||
end;
|
end;
|
||||||
if neg
|
if neg then
|
||||||
then y:=-(y+1);
|
y := -(y + 1);
|
||||||
Result := IntToStr(y);
|
Result := IntToStr(y);
|
||||||
end;
|
end;
|
||||||
ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS:
|
ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS:
|
||||||
@ -299,101 +298,95 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{MibToId}
|
|
||||||
function MibToId(mib:string):string;
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
|
|
||||||
Function walkInt(var s:string):integer;
|
function MibToId(Mib: string): string;
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
|
||||||
|
function WalkInt(var s: string): Integer;
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
t:string;
|
t: string;
|
||||||
begin
|
begin
|
||||||
x:=pos('.',s);
|
x := Pos('.', s);
|
||||||
if x<1 then
|
if x < 1 then
|
||||||
begin
|
begin
|
||||||
t:=s;
|
t := s;
|
||||||
s:='';
|
s := '';
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
t:=copy(s,1,x-1);
|
t := Copy(s, 1, x - 1);
|
||||||
s:=copy(s,x+1,length(s)-x);
|
s := Copy(s, x + 1, Length(s) - x);
|
||||||
end;
|
end;
|
||||||
result:=StrToIntDef(t,0);
|
Result := StrToIntDef(t, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
result:='';
|
Result := '';
|
||||||
x:=walkint(mib);
|
x := WalkInt(Mib);
|
||||||
x:=x*40+walkint(mib);
|
x := x * 40 + WalkInt(Mib);
|
||||||
result:=ASNEncOIDItem(x);
|
Result := ASNEncOIDItem(x);
|
||||||
while mib<>'' do
|
while Mib <> '' do
|
||||||
begin
|
begin
|
||||||
x:=walkint(mib);
|
x := WalkInt(Mib);
|
||||||
result:=result+ASNEncOIDItem(x);
|
Result := Result + ASNEncOIDItem(x);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{IdToMib}
|
|
||||||
Function IdToMib(id:string):string;
|
function IdToMib(const Id: string): string;
|
||||||
var
|
var
|
||||||
x,y,n:integer;
|
x, y, n: Integer;
|
||||||
begin
|
begin
|
||||||
result:='';
|
Result := '';
|
||||||
n:=1;
|
n := 1;
|
||||||
while length(id)+1>n do
|
while Length(Id) + 1 > n do
|
||||||
|
begin
|
||||||
|
x := ASNDecOIDItem(n, Id);
|
||||||
|
if (n - 1) = 1 then
|
||||||
begin
|
begin
|
||||||
x:=ASNDecOIDItem(n,id);
|
y := x div 40;
|
||||||
if (n-1)=1 then
|
x := x mod 40;
|
||||||
begin
|
Result := IntToStr(y);
|
||||||
y:=x div 40;
|
|
||||||
x:=x mod 40;
|
|
||||||
result:=IntTostr(y);
|
|
||||||
end;
|
|
||||||
result:=result+'.'+IntToStr(x);
|
|
||||||
end;
|
end;
|
||||||
|
Result := Result + '.' + IntToStr(x);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{IntMibToStr}
|
|
||||||
Function IntMibToStr(int:string):string;
|
function IntMibToStr(const Value: string): string;
|
||||||
Var
|
var
|
||||||
n,y:integer;
|
n, y: Integer;
|
||||||
begin
|
begin
|
||||||
y:=0;
|
y := 0;
|
||||||
for n:=1 to length(int)-1 do
|
for n := 1 to Length(Value) - 1 do
|
||||||
y:=y*256+ord(int[n]);
|
y := y * 256 + Ord(Value[n]);
|
||||||
result:=IntToStr(y);
|
Result := IntToStr(y);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{IPToID} //Hernan Sanchez
|
//Hernan Sanchez
|
||||||
|
|
||||||
function IPToID(Host: string): string;
|
function IPToID(Host: string): string;
|
||||||
var
|
var
|
||||||
s, t: string;
|
s, t: string;
|
||||||
i, x: integer;
|
i, x: Integer;
|
||||||
begin
|
begin
|
||||||
Result := '';
|
Result := '';
|
||||||
for x:= 1 to 3 do
|
for x := 1 to 3 do
|
||||||
begin
|
begin
|
||||||
t := '';
|
t := '';
|
||||||
s := StrScan(PChar(Host), '.');
|
s := StrScan(PChar(Host), '.');
|
||||||
t := Copy(Host, 1, (Length(Host) - Length(s)));
|
t := Copy(Host, 1, (Length(Host) - Length(s)));
|
||||||
Delete(Host, 1, (Length(Host) - Length(s) + 1));
|
Delete(Host, 1, (Length(Host) - Length(s) + 1));
|
||||||
i := StrTointDef(t, 0);
|
i := StrToIntDef(t, 0);
|
||||||
Result := Result + Chr(i);
|
Result := Result + Chr(i);
|
||||||
end;
|
end;
|
||||||
i := StrTointDef(Host, 0);
|
i := StrToIntDef(Host, 0);
|
||||||
Result := Result + Chr(i);
|
Result := Result + Chr(i);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
|
|
||||||
begin
|
|
||||||
exit;
|
|
||||||
asm
|
|
||||||
db 'Synapse ASN.1 library by Lukas Gebauer',0
|
|
||||||
end;
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
134
blcksck2.pas
134
blcksck2.pas
@ -1,134 +0,0 @@
|
|||||||
{==============================================================================|
|
|
||||||
| Project : Delphree - Synapse | 002.000.000 |
|
|
||||||
|==============================================================================|
|
|
||||||
| Content: Library base for RAW sockets |
|
|
||||||
|==============================================================================|
|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
|
||||||
| |
|
|
||||||
| Software distributed under the License is distributed on an "AS IS" basis, |
|
|
||||||
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
|
||||||
| the specific language governing rights and limitations under the License. |
|
|
||||||
|==============================================================================|
|
|
||||||
| The Original Code is Synapse Delphi Library. |
|
|
||||||
|==============================================================================|
|
|
||||||
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
|
||||||
| Portions created by Lukas Gebauer are Copyright (c)2000. |
|
|
||||||
| All Rights Reserved. |
|
|
||||||
|==============================================================================|
|
|
||||||
| Contributor(s): |
|
|
||||||
|==============================================================================|
|
|
||||||
| History: see HISTORY.HTM from distribution package |
|
|
||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
|
||||||
|==============================================================================}
|
|
||||||
|
|
||||||
{
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
Remember, this unit work only on Linux or Windows with Winsock2!
|
|
||||||
(on Win98 and WinNT 4.0 or higher)
|
|
||||||
If you must use this unit on Win95, download Wínsock2 from Microsoft
|
|
||||||
and distribute it with your application!
|
|
||||||
|
|
||||||
In spite of I use Winsock level version 1.1, RAW sockets work in this level only
|
|
||||||
if Winsock2 is installed on your computer!!!
|
|
||||||
|
|
||||||
On WinNT standardly RAW sockets work if program is running under user with
|
|
||||||
administrators provilegies. To use RAW sockets under another users, you must
|
|
||||||
create the following registry variable and set its value to DWORD 1:
|
|
||||||
|
|
||||||
HKLM\System\CurrentControlSet\Services\Afd\Parameters\DisableRawSecurity
|
|
||||||
|
|
||||||
After you change the registry, you need to restart your computer!
|
|
||||||
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
}
|
|
||||||
|
|
||||||
unit blcksck2;
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
synsock, SysUtils, blcksock,
|
|
||||||
{$IFDEF LINUX}
|
|
||||||
libc, kernelioctl;
|
|
||||||
{$ELSE}
|
|
||||||
winsock, windows;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
type
|
|
||||||
|
|
||||||
{TICMPBlockSocket}
|
|
||||||
TICMPBlockSocket = class (TBlockSocket)
|
|
||||||
public
|
|
||||||
procedure CreateSocket; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TRAWBlockSocket}
|
|
||||||
TRAWBlockSocket = class (TBlockSocket)
|
|
||||||
public
|
|
||||||
procedure CreateSocket; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TIPHeader = Record
|
|
||||||
VerLen : Byte;
|
|
||||||
TOS : Byte;
|
|
||||||
TotalLen : Word;
|
|
||||||
Identifer : Word;
|
|
||||||
FragOffsets : Word;
|
|
||||||
TTL : Byte;
|
|
||||||
Protocol : Byte;
|
|
||||||
CheckSum : Word;
|
|
||||||
SourceIp : Dword;
|
|
||||||
DestIp : Dword;
|
|
||||||
Options : Dword;
|
|
||||||
End;
|
|
||||||
|
|
||||||
function SetTimeout(Sock:TSocket;Timeout:integer):Boolean;
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
{======================================================================}
|
|
||||||
|
|
||||||
{TICMPBlockSocket.CreateSocket}
|
|
||||||
Procedure TICMPBlockSocket.CreateSocket;
|
|
||||||
begin
|
|
||||||
FSocket:=synsock.socket(PF_INET,integer(SOCK_RAW),IPPROTO_ICMP);
|
|
||||||
FProtocol:=IPPROTO_ICMP;
|
|
||||||
inherited createSocket;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{======================================================================}
|
|
||||||
|
|
||||||
{TRAWBlockSocket.CreateSocket}
|
|
||||||
Procedure TRAWBlockSocket.CreateSocket;
|
|
||||||
begin
|
|
||||||
FSocket:=synsock.socket(PF_INET,integer(SOCK_RAW),IPPROTO_RAW);
|
|
||||||
FProtocol:=IPPROTO_RAW;
|
|
||||||
inherited createSocket;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{======================================================================}
|
|
||||||
|
|
||||||
function SetTimeout(Sock:TSocket;Timeout:integer):Boolean;
|
|
||||||
var
|
|
||||||
len,Value,res:integer;
|
|
||||||
r1,r2:Boolean;
|
|
||||||
begin
|
|
||||||
Result:=False;
|
|
||||||
r1:=False;
|
|
||||||
r2:=False;
|
|
||||||
Value:=Timeout;
|
|
||||||
len:=SizeOf(Value);
|
|
||||||
Res:=synsock.setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@Value,len);
|
|
||||||
r1:=res<>SOCKET_ERROR;
|
|
||||||
Res:=synsock.setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,@Value,len);
|
|
||||||
r2:=res<>SOCKET_ERROR;
|
|
||||||
Result:=r1 and r2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
1278
blcksock.pas
1278
blcksock.pas
File diff suppressed because it is too large
Load Diff
563
dnssend.pas
563
dnssend.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 001.001.001 |
|
| Project : Delphree - Synapse | 001.001.002 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: DNS client |
|
| Content: DNS client |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -14,7 +14,7 @@
|
|||||||
| The Original Code is Synapse Delphi Library. |
|
| The Original Code is Synapse Delphi Library. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
||||||
| Portions created by Lukas Gebauer are Copyright (c)2000. |
|
| Portions created by Lukas Gebauer are Copyright (c)2000,2001. |
|
||||||
| All Rights Reserved. |
|
| All Rights Reserved. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Contributor(s): |
|
| Contributor(s): |
|
||||||
@ -23,351 +23,342 @@
|
|||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
//RFC-1035, RFC-1183, RFC1706, RFC1712, RFC2163, RFC2230
|
// RFC-1035, RFC-1183, RFC1706, RFC1712, RFC2163, RFC2230
|
||||||
|
|
||||||
{$Q-}
|
{$Q-}
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit DNSsend;
|
unit DNSsend;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Blcksock, sysutils, classes, SynaUtil;
|
SysUtils, Classes,
|
||||||
|
blcksock, SynaUtil;
|
||||||
|
|
||||||
const
|
const
|
||||||
Qtype_A =1;
|
cDnsProtocol = 'Domain';
|
||||||
Qtype_NS =2;
|
|
||||||
Qtype_MD =3;
|
|
||||||
Qtype_MF =4;
|
|
||||||
Qtype_CNAME =5;
|
|
||||||
Qtype_SOA =6;
|
|
||||||
Qtype_MB =7;
|
|
||||||
Qtype_MG =8;
|
|
||||||
Qtype_MR =9;
|
|
||||||
Qtype_NULL =10;
|
|
||||||
Qtype_WKS =11; //
|
|
||||||
Qtype_PTR =12;
|
|
||||||
Qtype_HINFO =13;
|
|
||||||
Qtype_MINFO =14;
|
|
||||||
Qtype_MX =15;
|
|
||||||
Qtype_TXT =16;
|
|
||||||
|
|
||||||
Qtype_RP =17;
|
QTYPE_A = 1;
|
||||||
Qtype_AFSDB =18;
|
QTYPE_NS = 2;
|
||||||
Qtype_X25 =19;
|
QTYPE_MD = 3;
|
||||||
Qtype_ISDN =20;
|
QTYPE_MF = 4;
|
||||||
Qtype_RT =21;
|
QTYPE_CNAME = 5;
|
||||||
Qtype_NSAP =22;
|
QTYPE_SOA = 6;
|
||||||
Qtype_NSAPPTR=23;
|
QTYPE_MB = 7;
|
||||||
Qtype_SIG =24; //RFC-2065
|
QTYPE_MG = 8;
|
||||||
Qtype_KEY =25; //RFC-2065
|
QTYPE_MR = 9;
|
||||||
Qtype_PX =26;
|
QTYPE_NULL = 10;
|
||||||
Qtype_GPOS =27;
|
QTYPE_WKS = 11; //
|
||||||
Qtype_AAAA =28; //IP6 Address [Susan Thomson]
|
QTYPE_PTR = 12;
|
||||||
Qtype_LOC =29; //RFC-1876
|
QTYPE_HINFO = 13;
|
||||||
Qtype_NXT =30; //RFC-2065
|
QTYPE_MINFO = 14;
|
||||||
|
QTYPE_MX = 15;
|
||||||
|
QTYPE_TXT = 16;
|
||||||
|
|
||||||
Qtype_SRV =33; //RFC-2052
|
QTYPE_RP = 17;
|
||||||
Qtype_NAPTR =35; //RFC-2168
|
QTYPE_AFSDB = 18;
|
||||||
Qtype_KX =36;
|
QTYPE_X25 = 19;
|
||||||
|
QTYPE_ISDN = 20;
|
||||||
|
QTYPE_RT = 21;
|
||||||
|
QTYPE_NSAP = 22;
|
||||||
|
QTYPE_NSAPPTR = 23;
|
||||||
|
QTYPE_SIG = 24; // RFC-2065
|
||||||
|
QTYPE_KEY = 25; // RFC-2065
|
||||||
|
QTYPE_PX = 26;
|
||||||
|
QTYPE_GPOS = 27;
|
||||||
|
QTYPE_AAAA = 28; // IP6 Address [Susan Thomson]
|
||||||
|
QTYPE_LOC = 29; // RFC-1876
|
||||||
|
QTYPE_NXT = 30; // RFC-2065
|
||||||
|
|
||||||
Qtype_AXFR =252; //
|
QTYPE_SRV = 33; // RFC-2052
|
||||||
Qtype_MAILB =253; //
|
QTYPE_NAPTR = 35; // RFC-2168
|
||||||
Qtype_MAILA =254; //
|
QTYPE_KX = 36;
|
||||||
Qtype_ALL =255; //
|
|
||||||
|
QTYPE_AXFR = 252; //
|
||||||
|
QTYPE_MAILB = 253; //
|
||||||
|
QTYPE_MAILA = 254; //
|
||||||
|
QTYPE_ALL = 255; //
|
||||||
|
|
||||||
type
|
type
|
||||||
TDNSSend = class
|
TDNSSend = class(TObject)
|
||||||
private
|
private
|
||||||
Buffer:string;
|
FTimeout: Integer;
|
||||||
Sock:TUDPBlockSocket;
|
FDNSHost: string;
|
||||||
function CompressName(Value:string):string;
|
FRCode: Integer;
|
||||||
function CodeHeader:string;
|
FBuffer: string;
|
||||||
function CodeQuery(Name:string; Qtype:integer):string;
|
FSock: TUDPBlockSocket;
|
||||||
function DecodeLabels(var From:integer):string;
|
function CompressName(const Value: string): string;
|
||||||
function DecodeResource(var i:integer; Name:string; Qtype:integer):string;
|
function CodeHeader: string;
|
||||||
|
function CodeQuery(const Name: string; QType: Integer): string;
|
||||||
|
function DecodeLabels(var From: Integer): string;
|
||||||
|
function DecodeResource(var i: Integer; const Name: string;
|
||||||
|
QType: Integer): string;
|
||||||
public
|
public
|
||||||
timeout:integer;
|
constructor Create;
|
||||||
DNSHost:string;
|
destructor Destroy; override;
|
||||||
RCode:integer;
|
function DNSQuery(Name: string; QType: Integer;
|
||||||
Constructor Create;
|
const Reply: TStrings): Boolean;
|
||||||
Destructor Destroy; override;
|
published
|
||||||
Function DNSQuery(Name:string;Qtype:integer;Reply:TStrings):Boolean;
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
|
property DNSHost: string read FDNSHost Write FDNSHost;
|
||||||
|
property RCode: Integer read FRCode;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function GetMailServers (DNSHost, domain:string; servers:TStringList):Boolean;
|
function GetMailServers(const DNSHost, Domain: string;
|
||||||
|
const Servers: TStrings): Boolean;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{TDNSSend.Create}
|
constructor TDNSSend.Create;
|
||||||
Constructor TDNSSend.Create;
|
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
sock:=TUDPBlockSocket.create;
|
FSock := TUDPBlockSocket.Create;
|
||||||
sock.CreateSocket;
|
FSock.CreateSocket;
|
||||||
timeout:=5000;
|
FTimeout := 5000;
|
||||||
DNShost:='localhost';
|
FDNSHost := cLocalhost;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TDNSSend.Destroy}
|
destructor TDNSSend.Destroy;
|
||||||
Destructor TDNSSend.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Sock.free;
|
FSock.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TDNSSend.ComressName}
|
function TDNSSend.CompressName(const Value: string): string;
|
||||||
function TDNSSend.CompressName(Value:string):string;
|
|
||||||
var
|
var
|
||||||
n:integer;
|
n: Integer;
|
||||||
s:String;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:='';
|
Result := '';
|
||||||
if Value='' then Result:=char(0)
|
if Value = '' then
|
||||||
else
|
Result := #0
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
s := '';
|
||||||
|
for n := 1 to Length(Value) do
|
||||||
|
if Value[n] = '.' then
|
||||||
begin
|
begin
|
||||||
s:='';
|
Result := Result + Char(Length(s)) + s;
|
||||||
for n:=1 to Length(Value) do
|
s := '';
|
||||||
if Value[n]='.' then
|
end
|
||||||
begin
|
else
|
||||||
Result:=Result+char(Length(s))+s;
|
s := s + Value[n];
|
||||||
s:='';
|
if s <> '' then
|
||||||
end
|
Result := Result + Char(Length(s)) + s;
|
||||||
else s:=s+Value[n];
|
Result := Result + #0;
|
||||||
if s<>'' then Result:=Result+char(Length(s))+s;
|
end;
|
||||||
Result:=Result+char(0);
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TDNSSend.CodeHeader}
|
function TDNSSend.CodeHeader: string;
|
||||||
function TDNSSend.CodeHeader:string;
|
|
||||||
begin
|
begin
|
||||||
Randomize;
|
Randomize;
|
||||||
Result:=Codeint(Random(32767)); //ID
|
Result := CodeInt(Random(32767)); // ID
|
||||||
Result:=Result+Codeint($0100); //flags
|
Result := Result + CodeInt($0100); // flags
|
||||||
Result:=Result+Codeint(1); //QDCount
|
Result := Result + CodeInt(1); // QDCount
|
||||||
Result:=Result+Codeint(0); //ANCount
|
Result := Result + CodeInt(0); // ANCount
|
||||||
Result:=Result+Codeint(0); //NSCount
|
Result := Result + CodeInt(0); // NSCount
|
||||||
Result:=Result+Codeint(0); //ARCount
|
Result := Result + CodeInt(0); // ARCount
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TDNSSend.CodeQuery}
|
function TDNSSend.CodeQuery(const Name: string; QType: Integer): string;
|
||||||
function TDNSSend.CodeQuery(Name:string; Qtype:integer):string;
|
|
||||||
begin
|
begin
|
||||||
Result:=Compressname(Name);
|
Result := CompressName(Name);
|
||||||
Result:=Result+Codeint(Qtype);
|
Result := Result + CodeInt(QType);
|
||||||
Result:=Result+Codeint(1); //Type INTERNET
|
Result := Result + CodeInt(1); // Type INTERNET
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TDNSSend.DecodeLabels}
|
function TDNSSend.DecodeLabels(var From: Integer): string;
|
||||||
function TDNSSend.DecodeLabels(var From:integer):string;
|
|
||||||
var
|
var
|
||||||
l,f:integer;
|
l, f: Integer;
|
||||||
begin
|
begin
|
||||||
Result:='';
|
Result := '';
|
||||||
while True do
|
while True do
|
||||||
|
begin
|
||||||
|
l := Ord(FBuffer[From]);
|
||||||
|
Inc(From);
|
||||||
|
if l = 0 then
|
||||||
|
Break;
|
||||||
|
if Result <> '' then
|
||||||
|
Result := Result + '.';
|
||||||
|
if (l and $C0) = $C0 then
|
||||||
begin
|
begin
|
||||||
l:=Ord(Buffer[From]);
|
f := l and $3F;
|
||||||
|
f := f * 256 + Ord(FBuffer[From]) + 1;
|
||||||
Inc(From);
|
Inc(From);
|
||||||
if l=0 then break;
|
Result := Result + DecodeLabels(f);
|
||||||
if Result<>'' then Result:=Result+'.';
|
Break;
|
||||||
if (l and $C0)=$C0
|
end
|
||||||
then
|
else
|
||||||
begin
|
|
||||||
f:=l and $3F;
|
|
||||||
f:=f*256+Ord(Buffer[From])+1;
|
|
||||||
Inc(From);
|
|
||||||
Result:=Result+Self.decodelabels(f);
|
|
||||||
break;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
Result:=Result+Copy(Buffer,From,l);
|
|
||||||
Inc(From,l);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TDNSSend.DecodeResource}
|
|
||||||
function TDNSSend.DecodeResource(var i:integer; Name:string;
|
|
||||||
Qtype:integer):string;
|
|
||||||
var
|
|
||||||
Rname:string;
|
|
||||||
RType,Len,j,x,n:integer;
|
|
||||||
begin
|
|
||||||
Result:='';
|
|
||||||
Rname:=decodelabels(i);
|
|
||||||
Rtype:=DeCodeint(Buffer,i);
|
|
||||||
Inc(i,8);
|
|
||||||
Len:=DeCodeint(Buffer,i);
|
|
||||||
Inc(i,2); //i point to begin of data
|
|
||||||
j:=i;
|
|
||||||
i:=i+len; //i point to next record
|
|
||||||
if (Name=Rname) and (Qtype=RType) then
|
|
||||||
begin
|
begin
|
||||||
case Rtype of
|
Result := Result + Copy(FBuffer, From, l);
|
||||||
Qtype_A :
|
Inc(From, l);
|
||||||
begin
|
|
||||||
Result:=IntToStr(Ord(Buffer[j]));
|
|
||||||
Inc(j);
|
|
||||||
Result:=Result+'.'+IntToStr(Ord(Buffer[j]));
|
|
||||||
Inc(j);
|
|
||||||
Result:=Result+'.'+IntToStr(Ord(Buffer[j]));
|
|
||||||
Inc(j);
|
|
||||||
Result:=Result+'.'+IntToStr(Ord(Buffer[j]));
|
|
||||||
end;
|
|
||||||
Qtype_NS,
|
|
||||||
Qtype_MD,
|
|
||||||
Qtype_MF,
|
|
||||||
Qtype_CNAME,
|
|
||||||
Qtype_MB,
|
|
||||||
Qtype_MG,
|
|
||||||
Qtype_MR,
|
|
||||||
Qtype_PTR,
|
|
||||||
Qtype_X25,
|
|
||||||
Qtype_NSAP,
|
|
||||||
Qtype_NSAPPTR:
|
|
||||||
begin
|
|
||||||
Result:=Decodelabels(j);
|
|
||||||
end;
|
|
||||||
Qtype_SOA :
|
|
||||||
begin
|
|
||||||
Result:=Decodelabels(j);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
for n:=1 to 5 do
|
|
||||||
begin
|
|
||||||
x:=DecodeInt(Buffer,j)*65536+DecodeInt(Buffer,j+2);
|
|
||||||
Inc(j,4);
|
|
||||||
Result:=Result+','+IntToStr(x);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
Qtype_NULL :
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
Qtype_WKS :
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
Qtype_HINFO,
|
|
||||||
Qtype_MINFO,
|
|
||||||
Qtype_RP,
|
|
||||||
Qtype_ISDN :
|
|
||||||
begin
|
|
||||||
Result:=Decodelabels(j);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
end;
|
|
||||||
Qtype_MX,
|
|
||||||
Qtype_AFSDB,
|
|
||||||
Qtype_RT,
|
|
||||||
Qtype_KX :
|
|
||||||
begin
|
|
||||||
x:=DecodeInt(Buffer,j);
|
|
||||||
Inc(j,2);
|
|
||||||
Result:=IntToStr(x);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
end;
|
|
||||||
Qtype_TXT :
|
|
||||||
begin
|
|
||||||
Result:=Decodelabels(j);
|
|
||||||
end;
|
|
||||||
Qtype_GPOS :
|
|
||||||
begin
|
|
||||||
Result:=Decodelabels(j);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
end;
|
|
||||||
Qtype_PX :
|
|
||||||
begin
|
|
||||||
x:=DecodeInt(Buffer,j);
|
|
||||||
Inc(j,2);
|
|
||||||
Result:=IntToStr(x);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
Result:=Result+','+Decodelabels(j);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TDNSSend.DNSQuery}
|
function TDNSSend.DecodeResource(var i: Integer; const Name: string;
|
||||||
Function TDNSSend.DNSQuery(Name:string;Qtype:integer;Reply:TStrings):Boolean;
|
QType: Integer): string;
|
||||||
var
|
var
|
||||||
x,n,i:integer;
|
Rname: string;
|
||||||
flag,qdcount, ancount, nscount, arcount:integer;
|
RType, Len, j, x, n: Integer;
|
||||||
s:string;
|
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := '';
|
||||||
Reply.Clear;
|
Rname := DecodeLabels(i);
|
||||||
if IsIP(Name) then Name:=ReverseIP(Name)+'.in-addr.arpa';
|
RType := DecodeInt(FBuffer, i);
|
||||||
Buffer:=Codeheader+CodeQuery(Name,QType);
|
Inc(i, 8);
|
||||||
sock.connect(DNSHost,'domain');
|
Len := DecodeInt(FBuffer, i);
|
||||||
// dump(Buffer,'c:\dnslog.Txt');
|
Inc(i, 2); // i point to begin of data
|
||||||
sock.sendstring(Buffer);
|
j := i;
|
||||||
if sock.canread(timeout)
|
i := i + len; // i point to next record
|
||||||
then begin
|
if (Name = Rname) and (QType = RType) then
|
||||||
x:=sock.waitingdata;
|
begin
|
||||||
setlength(Buffer,x);
|
case RType of
|
||||||
sock.recvbuffer(Pointer(Buffer),x);
|
QTYPE_A:
|
||||||
// dump(Buffer,'c:\dnslogr.Txt');
|
|
||||||
flag:=DeCodeint(Buffer,3);
|
|
||||||
RCode:=Flag and $000F;
|
|
||||||
if RCode=0 then
|
|
||||||
begin
|
begin
|
||||||
qdcount:=DeCodeint(Buffer,5);
|
Result := IntToStr(Ord(FBuffer[j]));
|
||||||
ancount:=DeCodeint(Buffer,7);
|
Inc(j);
|
||||||
nscount:=DeCodeint(Buffer,9);
|
Result := Result + '.' + IntToStr(Ord(FBuffer[j]));
|
||||||
arcount:=DeCodeint(Buffer,11);
|
Inc(j);
|
||||||
i:=13; //begin of body
|
Result := Result + '.' + IntToStr(Ord(FBuffer[j]));
|
||||||
if qdcount>0 then //skip questions
|
Inc(j);
|
||||||
for n:=1 to qdcount do
|
Result := Result + '.' + IntToStr(Ord(FBuffer[j]));
|
||||||
begin
|
end;
|
||||||
while (Buffer[i]<>#0) and ((Ord(Buffer[i]) and $C0)<>$C0) do
|
QTYPE_NS, QTYPE_MD, QTYPE_MF, QTYPE_CNAME, QTYPE_MB,
|
||||||
Inc(i);
|
QTYPE_MG, QTYPE_MR, QTYPE_PTR, QTYPE_X25, QTYPE_NSAP,
|
||||||
Inc(i,5);
|
QTYPE_NSAPPTR:
|
||||||
end;
|
Result := DecodeLabels(j);
|
||||||
if ancount>0 then
|
QTYPE_SOA:
|
||||||
for n:=1 to ancount do
|
begin
|
||||||
begin
|
Result := DecodeLabels(j);
|
||||||
s:=DecodeResource(i, Name, Qtype);
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
if s<>'' then
|
for n := 1 to 5 do
|
||||||
Reply.Add(s);
|
begin
|
||||||
end;
|
x := DecodeInt(FBuffer, j) * 65536 + DecodeInt(FBuffer, j + 2);
|
||||||
Result:=True;
|
Inc(j, 4);
|
||||||
|
Result := Result + ',' + IntToStr(x);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
QTYPE_NULL:
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
QTYPE_WKS:
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
QTYPE_HINFO, QTYPE_MINFO, QTYPE_RP, QTYPE_ISDN:
|
||||||
|
begin
|
||||||
|
Result := DecodeLabels(j);
|
||||||
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
|
end;
|
||||||
|
QTYPE_MX, QTYPE_AFSDB, QTYPE_RT, QTYPE_KX:
|
||||||
|
begin
|
||||||
|
x := DecodeInt(FBuffer, j);
|
||||||
|
Inc(j, 2);
|
||||||
|
Result := IntToStr(x);
|
||||||
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
|
end;
|
||||||
|
QTYPE_TXT:
|
||||||
|
Result := DecodeLabels(j);
|
||||||
|
QTYPE_GPOS:
|
||||||
|
begin
|
||||||
|
Result := DecodeLabels(j);
|
||||||
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
|
end;
|
||||||
|
QTYPE_PX:
|
||||||
|
begin
|
||||||
|
x := DecodeInt(FBuffer, j);
|
||||||
|
Inc(j, 2);
|
||||||
|
Result := IntToStr(x);
|
||||||
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
|
Result := Result + ',' + DecodeLabels(j);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TDNSSend.DNSQuery(Name: string; QType: Integer;
|
||||||
|
const Reply: TStrings): Boolean;
|
||||||
|
var
|
||||||
|
x, n, i: Integer;
|
||||||
|
flag, qdcount, ancount, nscount, arcount: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
Reply.Clear;
|
||||||
|
if IsIP(Name) then
|
||||||
|
Name := ReverseIP(Name) + '.in-addr.arpa';
|
||||||
|
FBuffer := CodeHeader + CodeQuery(Name, QType);
|
||||||
|
FSock.Connect(FDNSHost, cDnsProtocol);
|
||||||
|
FSock.SendString(FBuffer);
|
||||||
|
if FSock.CanRead(FTimeout) then
|
||||||
|
begin
|
||||||
|
x := FSock.WaitingData;
|
||||||
|
SetLength(FBuffer, x);
|
||||||
|
FSock.RecvBuffer(Pointer(FBuffer), x);
|
||||||
|
flag := DecodeInt(FBuffer, 3);
|
||||||
|
FRCode := Flag and $000F;
|
||||||
|
if FRCode = 0 then
|
||||||
|
begin
|
||||||
|
qdcount := DecodeInt(FBuffer, 5);
|
||||||
|
ancount := DecodeInt(FBuffer, 7);
|
||||||
|
nscount := DecodeInt(FBuffer, 9);
|
||||||
|
arcount := DecodeInt(FBuffer, 11);
|
||||||
|
i := 13; //begin of body
|
||||||
|
if qdcount > 0 then //skip questions
|
||||||
|
for n := 1 to qdcount do
|
||||||
|
begin
|
||||||
|
while (FBuffer[i] <> #0) and ((Ord(FBuffer[i]) and $C0) <> $C0) do
|
||||||
|
Inc(i);
|
||||||
|
Inc(i, 5);
|
||||||
|
end;
|
||||||
|
if ancount > 0 then
|
||||||
|
for n := 1 to ancount do
|
||||||
|
begin
|
||||||
|
s := DecodeResource(i, Name, QType);
|
||||||
|
if s <> '' then
|
||||||
|
Reply.Add(s);
|
||||||
|
end;
|
||||||
|
Result := True;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
function GetMailServers (DNSHost, domain:string; servers:TStringList):Boolean;
|
function GetMailServers(const DNSHost, Domain: string;
|
||||||
|
const Servers: TStrings): Boolean;
|
||||||
var
|
var
|
||||||
DNS:TDNSSend;
|
DNS: TDNSSend;
|
||||||
t:TStringList;
|
t: TStringList;
|
||||||
n,m,x:integer;
|
n, m, x: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := False;
|
||||||
servers.Clear;
|
Servers.Clear;
|
||||||
t:=TStringList.Create;
|
t := TStringList.Create;
|
||||||
DNS:=TDNSSend.Create;
|
DNS := TDNSSend.Create;
|
||||||
try
|
try
|
||||||
DNS.DNSHost:=DNSHost;
|
DNS.DNSHost := DNSHost;
|
||||||
if DNS.DNSQuery(domain,QType_MX,t) then
|
if DNS.DNSQuery(Domain, QType_MX, t) then
|
||||||
|
begin
|
||||||
|
{ normalize preference number to 5 digits }
|
||||||
|
for n := 0 to t.Count - 1 do
|
||||||
begin
|
begin
|
||||||
{normalize preference number to 5 digits}
|
x := Pos(',', t[n]);
|
||||||
for n:=0 to t.Count-1 do
|
if x > 0 then
|
||||||
begin
|
for m := 1 to 6 - x do
|
||||||
x:=Pos(',',t[n]);
|
t[n] := '0' + t[n];
|
||||||
if x>0 then
|
|
||||||
for m:=1 to 6-x do
|
|
||||||
t[n]:='0'+t[n];
|
|
||||||
end;
|
|
||||||
{sort server list}
|
|
||||||
t.Sorted:=True;
|
|
||||||
{result is sorted list without preference numbers}
|
|
||||||
for n:=0 to t.Count-1 do
|
|
||||||
begin
|
|
||||||
x:=Pos(',',t[n]);
|
|
||||||
servers.Add(Copy(t[n],x+1,Length(t[n])-x));
|
|
||||||
end;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
{ sort server list }
|
||||||
|
t.Sorted := True;
|
||||||
|
{ result is sorted list without preference numbers }
|
||||||
|
for n := 0 to t.Count - 1 do
|
||||||
|
begin
|
||||||
|
x := Pos(',', t[n]);
|
||||||
|
Servers.Add(Copy(t[n], x + 1, Length(t[n]) - x));
|
||||||
|
end;
|
||||||
|
Result := True;
|
||||||
|
end;
|
||||||
finally
|
finally
|
||||||
DNS.Free;
|
DNS.Free;
|
||||||
t.Free;
|
t.Free;
|
||||||
@ -375,5 +366,3 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
669
httpsend.pas
669
httpsend.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.001.000 |
|
| Project : Delphree - Synapse | 002.001.001 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: HTTP client |
|
| Content: HTTP client |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -23,423 +23,432 @@
|
|||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit HTTPSend;
|
unit HTTPSend;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Blcksock, sysutils, classes, SynaUtil, SynaCode;
|
SysUtils, Classes,
|
||||||
|
blcksock, SynaUtil, SynaCode;
|
||||||
|
|
||||||
const
|
const
|
||||||
CRLF=#13+#10;
|
cHttpProtocol = '80';
|
||||||
|
|
||||||
type
|
type
|
||||||
TTransferEncoding=(TE_UNKNOWN,
|
TTransferEncoding = (TE_UNKNOWN, TE_IDENTITY, TE_CHUNKED);
|
||||||
TE_IDENTITY,
|
|
||||||
TE_CHUNKED);
|
|
||||||
|
|
||||||
THTTPSend = class
|
THTTPSend = class(TObject)
|
||||||
private
|
private
|
||||||
Sock:TTCPBlockSocket;
|
FSock: TTCPBlockSocket;
|
||||||
TransferEncoding:TTransferEncoding;
|
FTransferEncoding: TTransferEncoding;
|
||||||
AliveHost:string;
|
FAliveHost: string;
|
||||||
AlivePort:string;
|
FAlivePort: string;
|
||||||
function ReadUnknown:boolean;
|
FHeaders: TStringList;
|
||||||
function ReadIdentity(size:integer):boolean;
|
FDocument: TMemoryStream;
|
||||||
function ReadChunked:boolean;
|
FMimeType: string;
|
||||||
|
FProtocol: string;
|
||||||
|
FKeepAlive: Boolean;
|
||||||
|
FTimeout: Integer;
|
||||||
|
FHTTPHost: string;
|
||||||
|
FHTTPPort: string;
|
||||||
|
FProxyHost: string;
|
||||||
|
FProxyPort: string;
|
||||||
|
FProxyUser: string;
|
||||||
|
FProxyPass: string;
|
||||||
|
FResultCode: Integer;
|
||||||
|
FResultString: string;
|
||||||
|
function ReadUnknown: Boolean;
|
||||||
|
function ReadIdentity(Size: Integer): Boolean;
|
||||||
|
function ReadChunked: Boolean;
|
||||||
public
|
public
|
||||||
headers:TStringlist;
|
constructor Create;
|
||||||
Document:TMemoryStream;
|
destructor Destroy; override;
|
||||||
MimeType:string;
|
procedure Clear;
|
||||||
Protocol:string;
|
procedure DecodeStatus(const Value: string);
|
||||||
KeepAlive:boolean;
|
function HTTPMethod(const Method, URL: string): Boolean;
|
||||||
Timeout:integer;
|
published
|
||||||
HTTPHost:string;
|
property Headers: TStringList read FHeaders Write FHeaders;
|
||||||
HTTPPort:string;
|
property Document: TMemoryStream read FDocument Write FDocument;
|
||||||
ProxyHost:string;
|
property MimeType: string read FMimeType Write FMimeType;
|
||||||
ProxyPort:string;
|
property Protocol: string read FProtocol Write FProtocol;
|
||||||
ProxyUser:string;
|
property KeepAlive: Boolean read FKeepAlive Write FKeepAlive;
|
||||||
ProxyPass:string;
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
ResultCode:integer;
|
property HTTPHost: string read FHTTPHost;
|
||||||
ResultString:string;
|
property HTTPPort: string read FHTTPPort;
|
||||||
Constructor Create;
|
property ProxyHost: string read FProxyHost Write FProxyHost;
|
||||||
Destructor Destroy; override;
|
property ProxyPort: string read FProxyPort Write FProxyPort;
|
||||||
procedure clear;
|
property ProxyUser: string read FProxyUser Write FProxyUser;
|
||||||
procedure DecodeStatus(value:string);
|
property ProxyPass: string read FProxyPass Write FProxyPass;
|
||||||
function HTTPmethod(method,URL:string):boolean;
|
property ResultCode: Integer read FResultCode;
|
||||||
|
property ResultString: string read FResultString;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function HttpGetText(URL:string;Response:TStrings):Boolean;
|
function HttpGetText(const URL: string; const Response: TStrings): Boolean;
|
||||||
function HttpGetBinary(URL:string;Response:TStream):Boolean;
|
function HttpGetBinary(const URL: string; const Response: TStream): Boolean;
|
||||||
function HttpPostBinary(URL:string;Data:TStream):Boolean;
|
function HttpPostBinary(const URL: string; const Data: TStream): Boolean;
|
||||||
function HttpPostURL(URL:string;URLData:string;Data:TStream):Boolean;
|
function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{THTTPSend.Create}
|
const
|
||||||
Constructor THTTPSend.Create;
|
CRLF = #13#10;
|
||||||
|
|
||||||
|
constructor THTTPSend.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
Headers:=TStringList.create;
|
FHeaders := TStringList.Create;
|
||||||
Document:=TMemoryStream.Create;
|
FDocument := TMemoryStream.Create;
|
||||||
sock:=TTCPBlockSocket.create;
|
FSock := TTCPBlockSocket.Create;
|
||||||
sock.SizeRecvBuffer:=65536;
|
FSock.SizeRecvBuffer := 65536;
|
||||||
sock.SizeSendBuffer:=65536;
|
FSock.SizeSendBuffer := 65536;
|
||||||
timeout:=300000;
|
FTimeout := 300000;
|
||||||
HTTPhost:='localhost';
|
FHTTPHost := cLocalhost;
|
||||||
HTTPPort:='80';
|
FHTTPPort := cHttpProtocol;
|
||||||
ProxyHost:='';
|
FProxyHost := '';
|
||||||
ProxyPort:='8080';
|
FProxyPort := '8080';
|
||||||
ProxyUser:='';
|
FProxyUser := '';
|
||||||
ProxyPass:='';
|
FProxyPass := '';
|
||||||
AliveHost:='';
|
FAliveHost := '';
|
||||||
AlivePort:='';
|
FAlivePort := '';
|
||||||
Protocol:='1.1';
|
FProtocol := '1.1';
|
||||||
KeepAlive:=true;
|
FKeepAlive := True;
|
||||||
Clear;
|
Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{THTTPSend.Destroy}
|
destructor THTTPSend.Destroy;
|
||||||
Destructor THTTPSend.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Sock.free;
|
FSock.Free;
|
||||||
Document.free;
|
FDocument.Free;
|
||||||
headers.free;
|
FHeaders.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{THTTPSend.Clear}
|
|
||||||
procedure THTTPSend.Clear;
|
procedure THTTPSend.Clear;
|
||||||
begin
|
begin
|
||||||
Document.Clear;
|
FDocument.Clear;
|
||||||
Headers.Clear;
|
FHeaders.Clear;
|
||||||
MimeType:='text/html';
|
FMimeType := 'text/html';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{THTTPSend.DecodeStatus}
|
procedure THTTPSend.DecodeStatus(const Value: string);
|
||||||
procedure THTTPSend.DecodeStatus(value:string);
|
|
||||||
var
|
var
|
||||||
s,su:string;
|
s, su: string;
|
||||||
begin
|
begin
|
||||||
s:=separateright(value,' ');
|
s := SeparateRight(Value, ' ');
|
||||||
su:=separateleft(s,' ');
|
su := SeparateLeft(s, ' ');
|
||||||
ResultCode:=StrToIntDef(su,0);
|
FResultCode := StrToIntDef(su, 0);
|
||||||
ResultString:=separateright(s,' ');
|
FResultString := SeparateRight(s, ' ');
|
||||||
if ResultString=s
|
if FResultString = s then
|
||||||
then ResultString:='';
|
FResultString := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{THTTPSend.HTTPmethod}
|
function THTTPSend.HTTPMethod(const Method, URL: string): Boolean;
|
||||||
function THTTPSend.HTTPmethod(method,URL:string):boolean;
|
|
||||||
var
|
var
|
||||||
sending,receiving:boolean;
|
Sending, Receiving: Boolean;
|
||||||
status100:boolean;
|
status100: Boolean;
|
||||||
status100error:string;
|
status100error: string;
|
||||||
ToClose:boolean;
|
ToClose: Boolean;
|
||||||
size:integer;
|
Size: Integer;
|
||||||
Prot,User,Pass,Host,Port,Path,Para,URI:string;
|
Prot, User, Pass, Host, Port, Path, Para, URI: string;
|
||||||
n:integer;
|
n: Integer;
|
||||||
s,su:string;
|
s, su: string;
|
||||||
begin
|
begin
|
||||||
{initial values}
|
{initial values}
|
||||||
result:=false;
|
Result := False;
|
||||||
ResultCode:=500;
|
FResultCode := 500;
|
||||||
ResultString:='';
|
FResultString := '';
|
||||||
|
|
||||||
URI:=ParseURL(URL,Prot,User,Pass,Host,Port,Path,Para);
|
URI := ParseURL(URL, Prot, User, Pass, Host, Port, Path, Para);
|
||||||
sending:=Document.Size>0;
|
Sending := Document.Size > 0;
|
||||||
{headers for sending data}
|
{Headers for Sending data}
|
||||||
status100:=sending and (protocol='1.1');
|
status100 := Sending and (FProtocol = '1.1');
|
||||||
if status100
|
|
||||||
then Headers.insert(0,'Expect: 100-continue');
|
|
||||||
if sending then
|
|
||||||
begin
|
|
||||||
Headers.insert(0,'Content-Length: '+inttostr(Document.size));
|
|
||||||
if MimeType<>''
|
|
||||||
then Headers.insert(0,'Content-Type: '+MimeType);
|
|
||||||
end;
|
|
||||||
{seting KeepAlives}
|
|
||||||
if not KeepAlive
|
|
||||||
then Headers.insert(0,'Connection: close');
|
|
||||||
{set target servers/proxy, authorisations, etc...}
|
|
||||||
if User<>''
|
|
||||||
then Headers.insert(0,'Authorization: Basic '+EncodeBase64(user+':'+pass));
|
|
||||||
if (proxyhost<>'') and (proxyUser<>'')
|
|
||||||
then Headers.insert(0,'Proxy-Authorization: Basic '+EncodeBase64(Proxyuser+':'+Proxypass));
|
|
||||||
Headers.insert(0,'Host: '+host+':'+port);
|
|
||||||
if proxyHost<>''
|
|
||||||
then URI:=prot+'://'+host+':'+port+URI;
|
|
||||||
if URI='/*'
|
|
||||||
then URI:='*';
|
|
||||||
if protocol='0.9'
|
|
||||||
then Headers.insert(0,uppercase(method)+' '+URI)
|
|
||||||
else Headers.insert(0,uppercase(method)+' '+URI+' HTTP/'+protocol);
|
|
||||||
if proxyhost=''
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
HttpHost:=host;
|
|
||||||
HttpPort:=port;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
HttpHost:=Proxyhost;
|
|
||||||
HttpPort:=Proxyport;
|
|
||||||
end;
|
|
||||||
if headers[headers.count-1]<>''
|
|
||||||
then headers.add('');
|
|
||||||
|
|
||||||
{connect}
|
|
||||||
if (Alivehost<>HTTPhost) or (AlivePort<>HTTPport)
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
sock.CloseSocket;
|
|
||||||
sock.CreateSocket;
|
|
||||||
sock.Connect(HTTPHost,HTTPPort);
|
|
||||||
if sock.lasterror<>0 then Exit;
|
|
||||||
Alivehost:=HTTPhost;
|
|
||||||
AlivePort:=HTTPport;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
if sock.canread(0) then
|
|
||||||
begin
|
|
||||||
sock.CloseSocket;
|
|
||||||
sock.createsocket;
|
|
||||||
sock.Connect(HTTPHost,HTTPPort);
|
|
||||||
if sock.lasterror<>0 then Exit;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{send headers}
|
|
||||||
Sock.SendString(Headers[0]+CRLF);
|
|
||||||
if protocol<>'0.9' then
|
|
||||||
for n:=1 to Headers.Count-1 do
|
|
||||||
Sock.SendString(Headers[n]+CRLF);
|
|
||||||
if sock.lasterror<>0 then Exit;
|
|
||||||
|
|
||||||
{reading Status}
|
|
||||||
Status100Error:='';
|
|
||||||
if status100 then
|
if status100 then
|
||||||
|
FHeaders.Insert(0, 'Expect: 100-continue');
|
||||||
|
if Sending then
|
||||||
|
begin
|
||||||
|
FHeaders.Insert(0, 'Content-Length: ' + IntToStr(FDocument.Size));
|
||||||
|
if FMimeType <> '' then
|
||||||
|
FHeaders.Insert(0, 'Content-Type: ' + FMimeType);
|
||||||
|
end;
|
||||||
|
{ setting KeepAlives }
|
||||||
|
if not FKeepAlive then
|
||||||
|
FHeaders.Insert(0, 'Connection: close');
|
||||||
|
{ set target servers/proxy, authorisations, etc... }
|
||||||
|
if User <> '' then
|
||||||
|
FHeaders.Insert(0, 'Authorization: Basic ' + EncodeBase64(user + ':' + pass));
|
||||||
|
if (FProxyHost <> '') and (FProxyUser <> '') then
|
||||||
|
FHeaders.Insert(0, 'Proxy-Authorization: Basic ' +
|
||||||
|
EncodeBase64(FProxyUser + ':' + FProxyPass));
|
||||||
|
FHeaders.Insert(0, 'Host: ' + Host + ':' + Port);
|
||||||
|
if FProxyHost <> '' then
|
||||||
|
URI := Prot + '://' + Host + ':' + Port + URI;
|
||||||
|
if URI = '/*' then
|
||||||
|
URI := '*';
|
||||||
|
if FProtocol = '0.9' then
|
||||||
|
FHeaders.Insert(0, UpperCase(Method) + ' ' + URI)
|
||||||
|
else
|
||||||
|
FHeaders.Insert(0, UpperCase(Method) + ' ' + URI + ' HTTP/' + FProtocol);
|
||||||
|
if FProxyHost = '' then
|
||||||
|
begin
|
||||||
|
FHTTPHost := Host;
|
||||||
|
FHTTPPort := Port;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
FHTTPHost := FProxyHost;
|
||||||
|
FHTTPPort := FProxyPort;
|
||||||
|
end;
|
||||||
|
if FHeaders[FHeaders.Count - 1] <> '' then
|
||||||
|
FHeaders.Add('');
|
||||||
|
|
||||||
|
{ connect }
|
||||||
|
if (FAliveHost <> FHTTPHost) or (FAlivePort <> FHTTPPort) then
|
||||||
|
begin
|
||||||
|
FSock.CloseSocket;
|
||||||
|
FSock.CreateSocket;
|
||||||
|
FSock.Connect(FHTTPHost, FHTTPPort);
|
||||||
|
if FSock.LastError <> 0 then
|
||||||
|
Exit;
|
||||||
|
FAliveHost := FHTTPHost;
|
||||||
|
FAlivePort := FHTTPPort;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if FSock.CanRead(0) then
|
||||||
begin
|
begin
|
||||||
repeat
|
FSock.CloseSocket;
|
||||||
s:=sock.recvstring(timeout);
|
FSock.CreateSocket;
|
||||||
if s<>'' then break;
|
FSock.Connect(FHTTPHost, FHTTPPort);
|
||||||
until sock.lasterror<>0;
|
if FSock.LastError <> 0 then
|
||||||
DecodeStatus(s);
|
Exit;
|
||||||
if (ResultCode>=100) and (ResultCode<200)
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
repeat
|
|
||||||
s:=sock.recvstring(timeout);
|
|
||||||
if s='' then break;
|
|
||||||
until sock.lasterror<>0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
sending:=false;
|
|
||||||
Status100Error:=s;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{send document}
|
{ send Headers }
|
||||||
if sending then
|
FSock.SendString(Headers[0] + CRLF);
|
||||||
begin
|
if FProtocol <> '0.9' then
|
||||||
Sock.SendBuffer(Document.memory,Document.size);
|
for n := 1 to FHeaders.Count - 1 do
|
||||||
if sock.lasterror<>0 then Exit;
|
FSock.SendString(FHeaders[n] + CRLF);
|
||||||
end;
|
if FSock.LastError <> 0 then
|
||||||
|
Exit;
|
||||||
|
|
||||||
clear;
|
{ reading Status }
|
||||||
size:=-1;
|
Status100Error := '';
|
||||||
TransferEncoding:=TE_UNKNOWN;
|
if status100 then
|
||||||
|
begin
|
||||||
{read status}
|
|
||||||
If Status100Error=''
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
repeat
|
|
||||||
s:=sock.recvstring(timeout);
|
|
||||||
if s<>'' then break;
|
|
||||||
until sock.lasterror<>0;
|
|
||||||
if pos('HTTP/',uppercase(s))=1
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
Headers.add(s);
|
|
||||||
decodeStatus(s);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
{old HTTP 0.9 and some buggy servers not send result}
|
|
||||||
s:=s+CRLF;
|
|
||||||
document.Write(pointer(s)^,length(s));
|
|
||||||
ResultCode:=0;
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else Headers.add(Status100Error);
|
|
||||||
|
|
||||||
{if need receive hedaers, receive and parse it}
|
|
||||||
ToClose:=protocol<>'1.1';
|
|
||||||
if Headers.count>0 then
|
|
||||||
repeat
|
repeat
|
||||||
s:=sock.recvstring(timeout);
|
s := FSock.RecvString(FTimeout);
|
||||||
Headers.Add(s);
|
if s <> '' then
|
||||||
if s=''
|
Break;
|
||||||
then break;
|
until FSock.LastError <> 0;
|
||||||
su:=uppercase(s);
|
DecodeStatus(s);
|
||||||
if pos('CONTENT-LENGTH:',su)=1 then
|
if (FResultCode >= 100) and (FResultCode < 200) then
|
||||||
begin
|
repeat
|
||||||
size:=strtointdef(separateright(s,' '),-1);
|
s := FSock.recvstring(FTimeout);
|
||||||
TransferEncoding:=TE_IDENTITY;
|
if s = '' then
|
||||||
end;
|
Break;
|
||||||
if pos('CONTENT-TYPE:',su)=1 then
|
until FSock.LastError <> 0
|
||||||
MimeType:=separateright(s,' ');
|
else
|
||||||
if pos('TRANSFER-ENCODING:',su)=1 then
|
begin
|
||||||
begin
|
Sending := False;
|
||||||
s:=separateright(su,' ');
|
Status100Error := s;
|
||||||
if pos('CHUNKED',s)>0 then
|
end;
|
||||||
TransferEncoding:=TE_CHUNKED;
|
end;
|
||||||
end;
|
|
||||||
if pos('CONNECTION: CLOSE',su)=1 then
|
{ send document }
|
||||||
ToClose:=true;
|
if Sending then
|
||||||
until sock.lasterror<>0;
|
begin
|
||||||
|
FSock.SendBuffer(FDocument.Memory, FDocument.Size);
|
||||||
|
if FSock.LastError <> 0 then
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Clear;
|
||||||
|
Size := -1;
|
||||||
|
FTransferEncoding := TE_UNKNOWN;
|
||||||
|
|
||||||
|
{ read status }
|
||||||
|
if Status100Error = '' then
|
||||||
|
begin
|
||||||
|
repeat
|
||||||
|
s := FSock.RecvString(FTimeout);
|
||||||
|
if s <> '' then
|
||||||
|
Break;
|
||||||
|
until FSock.LastError <> 0;
|
||||||
|
if Pos('HTTP/', UpperCase(s)) = 1 then
|
||||||
|
begin
|
||||||
|
FHeaders.Add(s);
|
||||||
|
DecodeStatus(s);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
{ old HTTP 0.9 and some buggy servers not send result }
|
||||||
|
s := s + CRLF;
|
||||||
|
FDocument.Write(Pointer(s)^, Length(s));
|
||||||
|
FResultCode := 0;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
FHeaders.Add(Status100Error);
|
||||||
|
|
||||||
|
{ if need receive hedaers, receive and parse it }
|
||||||
|
ToClose := FProtocol <> '1.1';
|
||||||
|
if FHeaders.Count > 0 then
|
||||||
|
repeat
|
||||||
|
s := FSock.RecvString(FTimeout);
|
||||||
|
FHeaders.Add(s);
|
||||||
|
if s = '' then
|
||||||
|
Break;
|
||||||
|
su := UpperCase(s);
|
||||||
|
if Pos('CONTENT-LENGTH:', su) = 1 then
|
||||||
|
begin
|
||||||
|
Size := StrToIntDef(SeparateRight(s, ' '), -1);
|
||||||
|
FTransferEncoding := TE_IDENTITY;
|
||||||
|
end;
|
||||||
|
if Pos('CONTENT-TYPE:', su) = 1 then
|
||||||
|
FMimeType := SeparateRight(s, ' ');
|
||||||
|
if Pos('TRANSFER-ENCODING:', su) = 1 then
|
||||||
|
begin
|
||||||
|
s := SeparateRight(su, ' ');
|
||||||
|
if Pos('CHUNKED', s) > 0 then
|
||||||
|
FTransferEncoding := TE_CHUNKED;
|
||||||
|
end;
|
||||||
|
if Pos('CONNECTION: CLOSE', su) = 1 then
|
||||||
|
ToClose := True;
|
||||||
|
until FSock.LastError <> 0;
|
||||||
|
|
||||||
{if need receive response body, read it}
|
{if need receive response body, read it}
|
||||||
Receiving:=Method<>'HEAD';
|
Receiving := Method <> 'HEAD';
|
||||||
Receiving:=Receiving and (ResultCode<>204);
|
Receiving := Receiving and (FResultCode <> 204);
|
||||||
Receiving:=Receiving and (ResultCode<>304);
|
Receiving := Receiving and (FResultCode <> 304);
|
||||||
if Receiving then
|
if Receiving then
|
||||||
case TransferEncoding of
|
case FTransferEncoding of
|
||||||
TE_UNKNOWN : readunknown;
|
TE_UNKNOWN:
|
||||||
TE_IDENTITY: readidentity(size);
|
ReadUnknown;
|
||||||
TE_CHUNKED : readChunked;
|
TE_IDENTITY:
|
||||||
|
ReadIdentity(Size);
|
||||||
|
TE_CHUNKED:
|
||||||
|
ReadChunked;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Document.Seek(0,soFromBeginning);
|
FDocument.Seek(0, soFromBeginning);
|
||||||
result:=true;
|
Result := True;
|
||||||
if ToClose then
|
if ToClose then
|
||||||
begin
|
begin
|
||||||
sock.closesocket;
|
FSock.CloseSocket;
|
||||||
Alivehost:='';
|
FAliveHost := '';
|
||||||
AlivePort:='';
|
FAlivePort := '';
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{THTTPSend.ReadUnknown}
|
|
||||||
function THTTPSend.ReadUnknown:boolean;
|
|
||||||
var
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
result:=false;
|
|
||||||
repeat
|
|
||||||
s:=sock.recvstring(timeout);
|
|
||||||
s:=s+CRLF;
|
|
||||||
document.Write(pointer(s)^,length(s));
|
|
||||||
until sock.lasterror<>0;
|
|
||||||
result:=true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{THTTPSend.ReadIdentity}
|
|
||||||
function THTTPSend.ReadIdentity(size:integer):boolean;
|
|
||||||
var
|
|
||||||
mem:TMemoryStream;
|
|
||||||
begin
|
|
||||||
mem:=TMemoryStream.create;
|
|
||||||
try
|
|
||||||
mem.SetSize(size);
|
|
||||||
sock.RecvBufferEx(mem.memory,size,timeout);
|
|
||||||
result:=sock.lasterror=0;
|
|
||||||
document.CopyFrom(mem,0);
|
|
||||||
finally
|
|
||||||
mem.free;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{THTTPSend.ReadChunked}
|
function THTTPSend.ReadUnknown: Boolean;
|
||||||
function THTTPSend.ReadChunked:boolean;
|
|
||||||
var
|
var
|
||||||
s:string;
|
s: string;
|
||||||
size:integer;
|
begin
|
||||||
|
repeat
|
||||||
|
s := FSock.RecvString(FTimeout);
|
||||||
|
s := s + CRLF;
|
||||||
|
FDocument.Write(Pointer(s)^, Length(s));
|
||||||
|
until FSock.LastError <> 0;
|
||||||
|
Result := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function THTTPSend.ReadIdentity(Size: Integer): Boolean;
|
||||||
|
var
|
||||||
|
mem: TMemoryStream;
|
||||||
|
begin
|
||||||
|
mem := TMemoryStream.Create;
|
||||||
|
try
|
||||||
|
mem.SetSize(Size);
|
||||||
|
FSock.RecvBufferEx(mem.Memory, Size, FTimeout);
|
||||||
|
Result := FSock.LastError = 0;
|
||||||
|
FDocument.CopyFrom(mem, 0);
|
||||||
|
finally
|
||||||
|
mem.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function THTTPSend.ReadChunked: Boolean;
|
||||||
|
var
|
||||||
|
s: string;
|
||||||
|
Size: Integer;
|
||||||
begin
|
begin
|
||||||
repeat
|
repeat
|
||||||
repeat
|
repeat
|
||||||
s:=sock.recvstring(timeout);
|
s := FSock.RecvString(FTimeout);
|
||||||
until s<>'';
|
until s <> '';
|
||||||
if sock.lasterror<>0
|
if FSock.LastError <> 0 then
|
||||||
then break;
|
Break;
|
||||||
s:=separateleft(s,' ');
|
s := SeparateLeft(s, ' ');
|
||||||
size:=strtointdef('$'+s,0);
|
Size := StrToIntDef('$' + s, 0);
|
||||||
if size=0 then break;
|
if Size = 0 then
|
||||||
ReadIdentity(size);
|
Break;
|
||||||
until false;
|
ReadIdentity(Size);
|
||||||
result:=sock.lasterror=0;
|
until False;
|
||||||
|
Result := FSock.LastError = 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{HttpGetText}
|
function HttpGetText(const URL: string; const Response: TStrings): Boolean;
|
||||||
function HttpGetText(URL:string;Response:TStrings):Boolean;
|
|
||||||
var
|
var
|
||||||
HTTP:THTTPSend;
|
HTTP: THTTPSend;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
HTTP := THTTPSend.Create;
|
||||||
HTTP:=THTTPSend.Create;
|
|
||||||
try
|
try
|
||||||
Result:=HTTP.HTTPmethod('GET',URL);
|
Result := HTTP.HTTPMethod('GET', URL);
|
||||||
response.LoadFromStream(HTTP.document);
|
Response.LoadFromStream(HTTP.Document);
|
||||||
finally
|
finally
|
||||||
HTTP.Free;
|
HTTP.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{HttpGetBinary}
|
function HttpGetBinary(const URL: string; const Response: TStream): Boolean;
|
||||||
function HttpGetBinary(URL:string;Response:TStream):Boolean;
|
|
||||||
var
|
var
|
||||||
HTTP:THTTPSend;
|
HTTP: THTTPSend;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
HTTP := THTTPSend.Create;
|
||||||
HTTP:=THTTPSend.Create;
|
|
||||||
try
|
try
|
||||||
Result:=HTTP.HTTPmethod('GET',URL);
|
Result := HTTP.HTTPMethod('GET', URL);
|
||||||
Response.Seek(0,soFromBeginning);
|
Response.Seek(0, soFromBeginning);
|
||||||
Response.CopyFrom(HTTP.document,0);
|
Response.CopyFrom(HTTP.Document, 0);
|
||||||
finally
|
finally
|
||||||
HTTP.Free;
|
HTTP.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{HttpPostBinary}
|
function HttpPostBinary(const URL: string; const Data: TStream): Boolean;
|
||||||
function HttpPostBinary(URL:string;Data:TStream):Boolean;
|
|
||||||
var
|
var
|
||||||
HTTP:THTTPSend;
|
HTTP: THTTPSend;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
HTTP := THTTPSend.Create;
|
||||||
HTTP:=THTTPSend.Create;
|
|
||||||
try
|
try
|
||||||
HTTP.Document.CopyFrom(data,0);
|
HTTP.Document.CopyFrom(Data, 0);
|
||||||
HTTP.MimeType:='Application/octet-stream';
|
HTTP.MimeType := 'Application/octet-stream';
|
||||||
Result:=HTTP.HTTPmethod('POST',URL);
|
Result := HTTP.HTTPMethod('POST', URL);
|
||||||
data.Seek(0,soFromBeginning);
|
Data.Seek(0, soFromBeginning);
|
||||||
data.CopyFrom(HTTP.document,0);
|
Data.CopyFrom(HTTP.Document, 0);
|
||||||
finally
|
finally
|
||||||
HTTP.Free;
|
HTTP.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{HttpPostURL}
|
function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
|
||||||
function HttpPostURL(URL:string;URLData:string;Data:TStream):Boolean;
|
|
||||||
var
|
var
|
||||||
HTTP:THTTPSend;
|
HTTP: THTTPSend;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
HTTP := THTTPSend.Create;
|
||||||
HTTP:=THTTPSend.Create;
|
|
||||||
try
|
try
|
||||||
HTTP.Document.Write(pointer(URLData)^,Length(URLData));
|
HTTP.Document.Write(Pointer(URLData)^, Length(URLData));
|
||||||
HTTP.MimeType:='application/x-url-encoded';
|
HTTP.MimeType := 'application/x-url-encoded';
|
||||||
Result:=HTTP.HTTPmethod('POST',URL);
|
Result := HTTP.HTTPMethod('POST', URL);
|
||||||
data.Seek(0,soFromBeginning);
|
Data.Seek(0, soFromBeginning);
|
||||||
data.CopyFrom(HTTP.document,0);
|
Data.CopyFrom(HTTP.Document, 0);
|
||||||
finally
|
finally
|
||||||
HTTP.Free;
|
HTTP.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
1135
mimechar.pas
1135
mimechar.pas
File diff suppressed because it is too large
Load Diff
240
mimeinln.pas
240
mimeinln.pas
@ -1,11 +1,11 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 001.000.001 |
|
| Project : Delphree - Synapse | 001.000.002 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: Inline MIME support procedures and functions |
|
| Content: Inline MIME support procedures and functions |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a Copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
| Software distributed under the License is distributed on an "AS IS" basis, |
|
| Software distributed under the License is distributed on an "AS IS" basis, |
|
||||||
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
||||||
@ -14,7 +14,7 @@
|
|||||||
| The Original Code is Synapse Delphi Library. |
|
| The Original Code is Synapse Delphi Library. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
||||||
| Portions created by Lukas Gebauer are Copyright (c)2000. |
|
| Portions created by Lukas Gebauer are Copyright (c)2000,2001. |
|
||||||
| All Rights Reserved. |
|
| All Rights Reserved. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Contributor(s): |
|
| Contributor(s): |
|
||||||
@ -23,151 +23,151 @@
|
|||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit MIMEinLn;
|
unit MIMEinLn;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
sysutils, classes, MIMEchar, SynaCode, SynaUtil;
|
SysUtils, Classes,
|
||||||
|
SynaChar, SynaCode, SynaUtil;
|
||||||
|
|
||||||
function InlineDecode(value:string;CP:TMimeChar):string;
|
function InlineDecode(const Value: string; CP: TMimeChar): string;
|
||||||
function InlineEncode(value:string;CP,MimeP:TMimeChar):string;
|
function InlineEncode(const Value: string; CP, MimeP: TMimeChar): string;
|
||||||
Function NeedInline(value:string):boolean;
|
function NeedInline(const Value: string): boolean;
|
||||||
function InlineCode(value:string):string;
|
function InlineCode(const Value: string): string;
|
||||||
function InlineEmail(value:string):string;
|
function InlineEmail(const Value: string): string;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{InlineDecode}
|
|
||||||
function InlineDecode(value:string;CP:TMimeChar):string;
|
|
||||||
var
|
|
||||||
s,su:string;
|
|
||||||
x,y,z,n:integer;
|
|
||||||
ichar:TMimeChar;
|
|
||||||
c:char;
|
|
||||||
|
|
||||||
function SearchEndInline(value:string;be:integer):integer;
|
function InlineDecode(const Value: string; CP: TMimeChar): string;
|
||||||
|
var
|
||||||
|
s, su: string;
|
||||||
|
x, y, z, n: Integer;
|
||||||
|
ichar: TMimeChar;
|
||||||
|
c: Char;
|
||||||
|
|
||||||
|
function SearchEndInline(const Value: string; be: Integer): Integer;
|
||||||
var
|
var
|
||||||
n,q:integer;
|
n, q: Integer;
|
||||||
begin
|
begin
|
||||||
q:=0;
|
q := 0;
|
||||||
result:=0;
|
Result := 0;
|
||||||
for n:=be+2 to length(value)-1 do
|
for n := be + 2 to Length(Value) - 1 do
|
||||||
if value[n]='?' then
|
if Value[n] = '?' then
|
||||||
|
begin
|
||||||
|
Inc(q);
|
||||||
|
if (q > 2) and (Value[n + 1] = '=') then
|
||||||
begin
|
begin
|
||||||
inc(q);
|
Result := n;
|
||||||
if (q>2) and (value[n+1]='=') then
|
Break;
|
||||||
begin
|
|
||||||
result:=n;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
result:=value;
|
Result := Value;
|
||||||
x:=pos('=?',result);
|
x := Pos('=?', Result);
|
||||||
y:=SearchEndInline(result,x);
|
y := SearchEndInline(Result, x);
|
||||||
while y>x do
|
while y > x do
|
||||||
|
begin
|
||||||
|
s := Copy(Result, x, y - x + 2);
|
||||||
|
su := Copy(s, 3, Length(s) - 4);
|
||||||
|
ichar := GetCPFromID(su);
|
||||||
|
z := Pos('?', su);
|
||||||
|
if (Length(su) >= (z + 2)) and (su[z + 2] = '?') then
|
||||||
begin
|
begin
|
||||||
s:=copy(result,x,y-x+2);
|
c := UpperCase(su)[z + 1];
|
||||||
su:=copy(s,3,length(s)-4);
|
su := Copy(su, z + 3, Length(su) - z - 2);
|
||||||
ichar:=GetCPfromID(su);
|
if c = 'B' then
|
||||||
z:=pos('?',su);
|
begin
|
||||||
if (length(su)>=(z+2)) and (su[z+2]='?') then
|
s := DecodeBase64(su);
|
||||||
begin
|
s := CharsetConversion(s, ichar, CP);
|
||||||
c:=uppercase(su)[z+1];
|
end;
|
||||||
su:=copy(su,z+3,length(su)-z-2);
|
if c = 'Q' then
|
||||||
if c='B' then
|
begin
|
||||||
begin
|
s := '';
|
||||||
s:=DecodeBase64(su);
|
for n := 1 to Length(su) do
|
||||||
s:=DecodeChar(s,ichar,CP);
|
if su[n] = '_' then
|
||||||
end;
|
s := s + ' '
|
||||||
if c='Q' then
|
else
|
||||||
begin
|
s := s + su[n];
|
||||||
s:='';
|
s := DecodeQuotedPrintable(s);
|
||||||
for n:=1 to length(su) do
|
s := CharsetConversion(s, ichar, CP);
|
||||||
if su[n]='_'
|
end;
|
||||||
then s:=s+' '
|
end;
|
||||||
else s:=s+su[n];
|
Result := Copy(Result, 1, x - 1) + s +
|
||||||
s:=DecodeQuotedprintable(s);
|
Copy(Result, y + 2, Length(Result) - y - 1);
|
||||||
s:=DecodeChar(s,ichar,CP);
|
x := Pos('=?', Result);
|
||||||
end;
|
y := SearchEndInline(Result, x);
|
||||||
end;
|
end;
|
||||||
result:=copy(result,1,x-1)+s+copy(result,y+2,length(result)-y-1);
|
end;
|
||||||
x:=pos('=?',result);
|
|
||||||
y:=SearchEndInline(result,x);
|
{==============================================================================}
|
||||||
|
|
||||||
|
function InlineEncode(const Value: string; CP, MimeP: TMimeChar): string;
|
||||||
|
var
|
||||||
|
s, s1: string;
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
s := CharsetConversion(Value, CP, MimeP);
|
||||||
|
s := EncodeQuotedPrintable(s);
|
||||||
|
s1 := '';
|
||||||
|
for n := 1 to Length(s) do
|
||||||
|
if s[n] = ' ' then
|
||||||
|
s1 := s1 + '=20'
|
||||||
|
else
|
||||||
|
s1 := s1 + s[n];
|
||||||
|
Result := '=?' + GetIdFromCP(MimeP) + '?Q?' + s1 + '?=';
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function NeedInline(const Value: string): boolean;
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
for n := 1 to Length(Value) do
|
||||||
|
if Value[n] in (SpecialChar + [Char(1)..Char(31), Char(128)..Char(255)]) then
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
Break;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{InlineEncode}
|
|
||||||
function InlineEncode(value:string;CP,MimeP:TMimeChar):string;
|
|
||||||
var
|
|
||||||
s,s1:string;
|
|
||||||
n:integer;
|
|
||||||
begin
|
|
||||||
s:=DecodeChar(value,CP,MimeP);
|
|
||||||
s:=EncodeQuotedPrintable(s);
|
|
||||||
s1:='';
|
|
||||||
for n:=1 to length(s) do
|
|
||||||
if s[n]=' '
|
|
||||||
then s1:=s1+'=20'
|
|
||||||
else s1:=s1+s[n];
|
|
||||||
result:='=?'+GetIdFromCP(MimeP)+'?Q?'+s1+'?=';
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
function InlineCode(const Value: string): string;
|
||||||
{NeedInline}
|
|
||||||
Function NeedInline(value:string):boolean;
|
|
||||||
var
|
var
|
||||||
n:integer;
|
c: TMimeChar;
|
||||||
begin
|
begin
|
||||||
result:=false;
|
if NeedInline(Value) then
|
||||||
for n:=1 to length(value) do
|
begin
|
||||||
if value[n] in (SpecialChar+[char(1)..char(31),char(128)..char(255)]) then
|
c := IdealCharsetCoding(Value, GetCurCP,
|
||||||
begin
|
[ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
|
||||||
result:=true;
|
ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10]);
|
||||||
break;
|
Result := InlineEncode(Value, GetCurCP, c);
|
||||||
end;
|
end
|
||||||
end;
|
else
|
||||||
|
Result := Value;
|
||||||
{==============================================================================}
|
|
||||||
{InlineCode}
|
|
||||||
function InlineCode(value:string):string;
|
|
||||||
var
|
|
||||||
c:TMimeChar;
|
|
||||||
begin
|
|
||||||
if NeedInline(value)
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
c:=IdealCoding(value,GetCurCP,
|
|
||||||
[ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
|
|
||||||
ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10]);
|
|
||||||
result:=InlineEncode(value,GetCurCP,c);
|
|
||||||
end
|
|
||||||
else result:=value;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{InlineEmail}
|
|
||||||
function InlineEmail(value:string):string;
|
|
||||||
var
|
|
||||||
sd,se:string;
|
|
||||||
begin
|
|
||||||
sd:=getEmaildesc(value);
|
|
||||||
se:=getEmailAddr(value);
|
|
||||||
if sd=''
|
|
||||||
then result:=se
|
|
||||||
else result:='"'+InlineCode(sd)+'"<'+se+'>';
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
|
function InlineEmail(const Value: string): string;
|
||||||
|
var
|
||||||
|
sd, se: string;
|
||||||
begin
|
begin
|
||||||
exit;
|
sd := GetEmailDesc(Value);
|
||||||
asm
|
se := GetEmailAddr(Value);
|
||||||
db 'Synapse Inline MIME encoding and decoding library by Lukas Gebauer',0
|
if sd = '' then
|
||||||
end;
|
Result := se
|
||||||
|
else
|
||||||
|
Result := '"' + InlineCode(sd) + '"<' + se + '>';
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
538
mimemess.pas
538
mimemess.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 001.003.000 |
|
| Project : Delphree - Synapse | 001.004.000 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: MIME message object |
|
| Content: MIME message object |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are Subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -19,314 +19,334 @@
|
|||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Contributor(s): |
|
| Contributor(s): |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| History: see HISTORY.HTM from distribution package |
|
| History: see HISTORY.HTM From distribution package |
|
||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit MIMEmess;
|
unit MIMEmess;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
classes, Sysutils, MIMEpart, MimeChar, SynaUtil, MIMEInLn;
|
Classes, SysUtils,
|
||||||
|
MIMEpart, SynaChar, SynaUtil, MIMEinLn;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
TMessHeader = class(TObject)
|
||||||
TMessHeader=record
|
|
||||||
from:string;
|
|
||||||
ToList:tstringlist;
|
|
||||||
subject:string;
|
|
||||||
organization:string;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TMimeMess=class(TObject)
|
|
||||||
private
|
private
|
||||||
|
FFrom: string;
|
||||||
|
FToList: TStringList;
|
||||||
|
FSubject: string;
|
||||||
|
FOrganization: string;
|
||||||
public
|
public
|
||||||
PartList:TList;
|
|
||||||
Lines:TStringList;
|
|
||||||
header:TMessHeader;
|
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Clear;
|
procedure Clear;
|
||||||
function AddPart:integer;
|
published
|
||||||
procedure AddPartText(value:tstringList);
|
property From: string read FFrom Write FFrom;
|
||||||
procedure AddPartHTML(value:tstringList);
|
property ToList: TStringList read FToList Write FToList;
|
||||||
procedure AddPartHTMLBinary(Value,Cid:string);
|
property Subject: string read FSubject Write FSubject;
|
||||||
procedure AddPartBinary(value:string);
|
property Organization: string read FOrganization Write FOrganization;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TMimeMess = class(TObject)
|
||||||
|
private
|
||||||
|
FPartList: TList;
|
||||||
|
FLines: TStringList;
|
||||||
|
FHeader: TMessHeader;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure Clear;
|
||||||
|
function AddPart: Integer;
|
||||||
|
procedure AddPartText(Value: TStringList);
|
||||||
|
procedure AddPartHTML(Value: TStringList);
|
||||||
|
procedure AddPartHTMLBinary(Value, Cid: string);
|
||||||
|
procedure AddPartBinary(Value: string);
|
||||||
procedure EncodeMessage;
|
procedure EncodeMessage;
|
||||||
procedure FinalizeHeaders;
|
procedure FinalizeHeaders;
|
||||||
procedure ParseHeaders;
|
procedure ParseHeaders;
|
||||||
procedure DecodeMessage;
|
procedure DecodeMessage;
|
||||||
end;
|
published
|
||||||
|
property PartList: TList read FPartList Write FPartList;
|
||||||
|
property Lines: TStringList read FLines Write FLines;
|
||||||
|
property Header: TMessHeader read FHeader Write FHeader;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{TMimeMess.Create}
|
|
||||||
Constructor TMimeMess.Create;
|
constructor TMessHeader.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
PartList:=TList.create;
|
FToList := TStringList.Create;
|
||||||
Lines:=TStringList.create;
|
|
||||||
Header.ToList:=TStringList.create;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TMimeMess.Destroy}
|
destructor TMessHeader.Destroy;
|
||||||
Destructor TMimeMess.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Header.ToList.free;
|
FToList.Free;
|
||||||
Lines.free;
|
inherited Destroy;
|
||||||
PartList.free;
|
|
||||||
inherited destroy;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{TMimeMess.Clear}
|
|
||||||
|
procedure TMessHeader.Clear;
|
||||||
|
begin
|
||||||
|
FFrom := '';
|
||||||
|
FToList.Clear;
|
||||||
|
FSubject := '';
|
||||||
|
FOrganization := '';
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
constructor TMimeMess.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
FPartList := TList.Create;
|
||||||
|
FLines := TStringList.Create;
|
||||||
|
FHeader := TMessHeader.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TMimeMess.Destroy;
|
||||||
|
begin
|
||||||
|
FHeader.Free;
|
||||||
|
Lines.Free;
|
||||||
|
PartList.Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
procedure TMimeMess.Clear;
|
procedure TMimeMess.Clear;
|
||||||
var
|
var
|
||||||
n:integer;
|
n: Integer;
|
||||||
begin
|
begin
|
||||||
Lines.clear;
|
Lines.Clear;
|
||||||
for n:=0 to PartList.count-1 do
|
for n := 0 to PartList.Count - 1 do
|
||||||
TMimePart(PartList[n]).Free;
|
TMimePart(PartList[n]).Free;
|
||||||
PartList.Clear;
|
PartList.Clear;
|
||||||
with header do
|
FHeader.Clear;
|
||||||
begin
|
|
||||||
from:='';
|
|
||||||
ToList.clear;
|
|
||||||
subject:='';
|
|
||||||
organization:='';
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{TMimeMess.AddPart}
|
|
||||||
function TMimeMess.AddPart:integer;
|
function TMimeMess.AddPart: Integer;
|
||||||
var
|
var
|
||||||
mp:TMimePart;
|
mp: TMimePart;
|
||||||
begin
|
begin
|
||||||
mp:=TMimePart.create;
|
mp := TMimePart.Create;
|
||||||
result:=PartList.Add(mp);
|
Result := PartList.Add(mp);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{TMimeMess.AddPartText}
|
|
||||||
procedure TMimeMess.AddPartText(value:tstringList);
|
procedure TMimeMess.AddPartText(Value: TStringList);
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
x:=Addpart;
|
x := AddPart;
|
||||||
with TMimePart(PartList[x]) do
|
with TMimePart(PartList[x]) do
|
||||||
begin
|
begin
|
||||||
value.SaveToStream(decodedlines);
|
Value.SaveToStream(DecodedLines);
|
||||||
primary:='text';
|
Primary := 'text';
|
||||||
secondary:='plain';
|
Secondary := 'plain';
|
||||||
description:='Message text';
|
Description := 'Message text';
|
||||||
disposition:='inline';
|
Disposition := 'inline';
|
||||||
CharsetCode:=IdealCoding(value.text,targetCharset,
|
CharsetCode := IdealCharsetCoding(Value.Text, TargetCharset,
|
||||||
[ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
|
[ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
|
||||||
ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10]);
|
ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10]);
|
||||||
EncodingCode:=ME_QUOTED_PRINTABLE;
|
EncodingCode := ME_QUOTED_PRINTABLE;
|
||||||
EncodePart;
|
EncodePart;
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{TMimeMess.AddPartHTML}
|
|
||||||
procedure TMimeMess.AddPartHTML(value:tstringList);
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
begin
|
|
||||||
x:=Addpart;
|
|
||||||
with TMimePart(PartList[x]) do
|
|
||||||
begin
|
|
||||||
value.SaveToStream(decodedlines);
|
|
||||||
primary:='text';
|
|
||||||
secondary:='html';
|
|
||||||
description:='HTML text';
|
|
||||||
disposition:='inline';
|
|
||||||
CharsetCode:=UTF_8;
|
|
||||||
EncodingCode:=ME_QUOTED_PRINTABLE;
|
|
||||||
EncodePart;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{TMimeMess.AddPartBinary}
|
|
||||||
procedure TMimeMess.AddPartBinary(value:string);
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
x:=Addpart;
|
|
||||||
with TMimePart(PartList[x]) do
|
|
||||||
begin
|
|
||||||
DecodedLines.LoadFromFile(Value);
|
|
||||||
s:=ExtractFileName(value);
|
|
||||||
MimeTypeFromExt(s);
|
|
||||||
description:='Attached file: '+s;
|
|
||||||
disposition:='attachment';
|
|
||||||
filename:=s;
|
|
||||||
EncodingCode:=ME_BASE64;
|
|
||||||
EncodePart;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TMimeMess.AddPartHTMLBinary}
|
|
||||||
procedure TMimeMess.AddPartHTMLBinary(Value,Cid:string);
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
x:=Addpart;
|
|
||||||
with TMimePart(PartList[x]) do
|
|
||||||
begin
|
|
||||||
DecodedLines.LoadFromFile(Value);
|
|
||||||
s:=ExtractFileName(value);
|
|
||||||
MimeTypeFromExt(s);
|
|
||||||
description:='Included file: '+s;
|
|
||||||
disposition:='inline';
|
|
||||||
contentID:=cid;
|
|
||||||
filename:=s;
|
|
||||||
EncodingCode:=ME_BASE64;
|
|
||||||
EncodePart;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{TMimeMess.Encodemessage}
|
|
||||||
procedure TMimeMess.Encodemessage;
|
|
||||||
var
|
|
||||||
bound:string;
|
|
||||||
n:integer;
|
|
||||||
m:TMimepart;
|
|
||||||
begin
|
|
||||||
lines.clear;
|
|
||||||
If PartList.Count=1
|
|
||||||
then
|
|
||||||
Lines.assign(TMimePart(PartList[0]).lines)
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
bound:=generateboundary;
|
|
||||||
for n:=0 to PartList.count-1 do
|
|
||||||
begin
|
|
||||||
Lines.add('--'+bound);
|
|
||||||
lines.AddStrings(TMimePart(PartList[n]).lines);
|
|
||||||
end;
|
|
||||||
Lines.add('--'+bound);
|
|
||||||
m:=TMimePart.Create;
|
|
||||||
try
|
|
||||||
Lines.SaveToStream(m.DecodedLines);
|
|
||||||
m.Primary:='Multipart';
|
|
||||||
m.secondary:='mixed';
|
|
||||||
m.description:='Multipart message';
|
|
||||||
m.boundary:=bound;
|
|
||||||
m.EncodePart;
|
|
||||||
Lines.assign(m.lines);
|
|
||||||
finally
|
|
||||||
m.free;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{TMimeMess.FinalizeHeaders}
|
|
||||||
procedure TMimeMess.FinalizeHeaders;
|
|
||||||
var
|
|
||||||
n:integer;
|
|
||||||
begin
|
|
||||||
Lines.Insert(0,'x-mailer: Synapse - Delphi TCP/IP library by Lukas Gebauer');
|
|
||||||
Lines.Insert(0,'MIME-Version: 1.0 (produced by Synapse)');
|
|
||||||
Lines.Insert(0,'date: '+Rfc822DateTime(now));
|
|
||||||
if header.organization<>''
|
|
||||||
then Lines.Insert(0,'Organization: '+InlineCode(header.organization));
|
|
||||||
if header.subject<>''
|
|
||||||
then Lines.Insert(0,'Subject: '+InlineCode(header.subject));
|
|
||||||
for n:=0 to Header.ToList.count-1 do
|
|
||||||
Lines.Insert(0,'To: '+InlineEmail(header.ToList[n]));
|
|
||||||
Lines.Insert(0,'From: '+InlineEmail(header.from));
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{TMimeMess.ParseHeaders}
|
|
||||||
procedure TMimeMess.ParseHeaders;
|
|
||||||
var
|
|
||||||
s:string;
|
|
||||||
x:integer;
|
|
||||||
cp:TMimeChar;
|
|
||||||
begin
|
|
||||||
cp:=getCurCP;
|
|
||||||
header.ToList.clear;
|
|
||||||
x:=0;
|
|
||||||
while lines.count>x do
|
|
||||||
begin
|
|
||||||
s:=normalizeheader(lines,x);
|
|
||||||
if s=''
|
|
||||||
then break;
|
|
||||||
If pos('FROM:',uppercase(s))=1
|
|
||||||
then header.from:=InlineDecode(separateright(s,':'),cp);
|
|
||||||
If pos('SUBJECT:',uppercase(s))=1
|
|
||||||
then header.subject:=InlineDecode(separateright(s,':'),cp);
|
|
||||||
If pos('ORGANIZATION:',uppercase(s))=1
|
|
||||||
then header.organization:=InlineDecode(separateright(s,':'),cp);
|
|
||||||
If pos('TO:',uppercase(s))=1
|
|
||||||
then header.ToList.add(InlineDecode(separateright(s,':'),cp));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{TMimeMess.DecodeMessage}
|
|
||||||
procedure TMimeMess.DecodeMessage;
|
|
||||||
var
|
|
||||||
l:tstringlist;
|
|
||||||
m:tmimepart;
|
|
||||||
x,i:integer;
|
|
||||||
bound:string;
|
|
||||||
begin
|
|
||||||
l:=tstringlist.create;
|
|
||||||
m:=tmimepart.create;
|
|
||||||
try
|
|
||||||
l.assign(lines);
|
|
||||||
with header do
|
|
||||||
begin
|
|
||||||
from:='';
|
|
||||||
ToList.clear;
|
|
||||||
subject:='';
|
|
||||||
organization:='';
|
|
||||||
end;
|
|
||||||
ParseHeaders;
|
|
||||||
m.ExtractPart(l,0);
|
|
||||||
if m.primarycode=MP_MULTIPART
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
bound:=m.boundary;
|
|
||||||
i:=0;
|
|
||||||
repeat
|
|
||||||
x:=AddPart;
|
|
||||||
with TMimePart(PartList[x]) do
|
|
||||||
begin
|
|
||||||
boundary:=bound;
|
|
||||||
i:=ExtractPart(l,i);
|
|
||||||
DecodePart;
|
|
||||||
end;
|
|
||||||
until i>=l.count-2;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
x:=AddPart;
|
|
||||||
with TMimePart(PartList[x]) do
|
|
||||||
begin
|
|
||||||
ExtractPart(l,0);
|
|
||||||
DecodePart;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
m.free;
|
|
||||||
l.free;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
|
procedure TMimeMess.AddPartHTML(Value: TStringList);
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
begin
|
||||||
|
x := AddPart;
|
||||||
|
with TMimePart(PartList[x]) do
|
||||||
|
begin
|
||||||
|
Value.SaveToStream(DecodedLines);
|
||||||
|
Primary := 'text';
|
||||||
|
Secondary := 'html';
|
||||||
|
Description := 'HTML text';
|
||||||
|
Disposition := 'inline';
|
||||||
|
CharsetCode := UTF_8;
|
||||||
|
EncodingCode := ME_QUOTED_PRINTABLE;
|
||||||
|
EncodePart;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
procedure TMimeMess.AddPartBinary(Value: string);
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
x := AddPart;
|
||||||
|
with TMimePart(PartList[x]) do
|
||||||
|
begin
|
||||||
|
DecodedLines.LoadFromFile(Value);
|
||||||
|
s := ExtractFileName(Value);
|
||||||
|
MimeTypeFromExt(s);
|
||||||
|
Description := 'Attached file: ' + s;
|
||||||
|
Disposition := 'attachment';
|
||||||
|
FileName := s;
|
||||||
|
EncodingCode := ME_BASE64;
|
||||||
|
EncodePart;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMimeMess.AddPartHTMLBinary(Value, Cid: string);
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
x := AddPart;
|
||||||
|
with TMimePart(PartList[x]) do
|
||||||
|
begin
|
||||||
|
DecodedLines.LoadFromFile(Value);
|
||||||
|
s := ExtractFileName(Value);
|
||||||
|
MimeTypeFromExt(s);
|
||||||
|
Description := 'Included file: ' + s;
|
||||||
|
Disposition := 'inline';
|
||||||
|
ContentID := cid;
|
||||||
|
FileName := s;
|
||||||
|
EncodingCode := ME_BASE64;
|
||||||
|
EncodePart;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
procedure TMimeMess.EncodeMessage;
|
||||||
|
var
|
||||||
|
bound: string;
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
Lines.Clear;
|
||||||
|
if PartList.Count = 1 then
|
||||||
|
Lines.Assign(TMimePart(PartList[0]).Lines)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
bound := GenerateBoundary;
|
||||||
|
for n := 0 to PartList.Count - 1 do
|
||||||
|
begin
|
||||||
|
Lines.Add('--' + bound);
|
||||||
|
Lines.AddStrings(TMimePart(PartList[n]).Lines);
|
||||||
|
end;
|
||||||
|
Lines.Add('--' + bound);
|
||||||
|
with TMimePart.Create do
|
||||||
|
try
|
||||||
|
Self.Lines.SaveToStream(DecodedLines);
|
||||||
|
Primary := 'Multipart';
|
||||||
|
Secondary := 'mixed';
|
||||||
|
Description := 'Multipart message';
|
||||||
|
Boundary := bound;
|
||||||
|
EncodePart;
|
||||||
|
Self.Lines.Assign(Lines);
|
||||||
|
finally
|
||||||
|
Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
procedure TMimeMess.FinalizeHeaders;
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
Lines.Insert(0, 'x-mailer: Synapse - Delphi TCP/IP library by Lukas Gebauer');
|
||||||
|
Lines.Insert(0, 'MIME-Version: 1.0 (produced by Synapse)');
|
||||||
|
Lines.Insert(0, 'date: ' + Rfc822DateTime(Now));
|
||||||
|
if FHeader.Organization <> '' then
|
||||||
|
Lines.Insert(0, 'Organization: ' + InlineCode(Header.Organization));
|
||||||
|
if Header.Subject <> '' then
|
||||||
|
FLines.Insert(0, 'Subject: ' + InlineCode(Header.Subject));
|
||||||
|
for n := 0 to FHeader.ToList.Count - 1 do
|
||||||
|
Lines.Insert(0, 'To: ' + InlineEmail(FHeader.ToList[n]));
|
||||||
|
Lines.Insert(0, 'From: ' + InlineEmail(FHeader.From));
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
procedure TMimeMess.ParseHeaders;
|
||||||
|
var
|
||||||
|
s: string;
|
||||||
|
x: Integer;
|
||||||
|
cp: TMimeChar;
|
||||||
|
begin
|
||||||
|
cp := GetCurCP;
|
||||||
|
FHeader.Clear;
|
||||||
|
x := 0;
|
||||||
|
while Lines.Count > x do
|
||||||
|
begin
|
||||||
|
s := NormalizeHeader(Lines, x);
|
||||||
|
if s = '' then
|
||||||
|
Break;
|
||||||
|
if Pos('FROM:', UpperCase(s)) = 1 then
|
||||||
|
FHeader.From := InlineDecode(SeparateRight(s, ':'), cp);
|
||||||
|
if Pos('SUBJECT:', UpperCase(s)) = 1 then
|
||||||
|
FHeader.Subject := InlineDecode(SeparateRight(s, ':'), cp);
|
||||||
|
if Pos('ORGANIZATION:', UpperCase(s)) = 1 then
|
||||||
|
FHeader.Organization := InlineDecode(SeparateRight(s, ':'), cp);
|
||||||
|
if Pos('TO:', UpperCase(s)) = 1 then
|
||||||
|
FHeader.ToList.Add(InlineDecode(SeparateRight(s, ':'), cp));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
procedure TMimeMess.DecodeMessage;
|
||||||
|
var
|
||||||
|
l: TStringList;
|
||||||
|
m: TMimePart;
|
||||||
|
x, i: Integer;
|
||||||
|
bound: string;
|
||||||
|
begin
|
||||||
|
l := TStringList.Create;
|
||||||
|
m := TMimePart.Create;
|
||||||
|
try
|
||||||
|
l.Assign(Lines);
|
||||||
|
FHeader.Clear;
|
||||||
|
ParseHeaders;
|
||||||
|
m.ExtractPart(l, 0);
|
||||||
|
if m.PrimaryCode = MP_MULTIPART then
|
||||||
|
begin
|
||||||
|
bound := m.Boundary;
|
||||||
|
i := 0;
|
||||||
|
repeat
|
||||||
|
x := AddPart;
|
||||||
|
with TMimePart(PartList[x]) do
|
||||||
|
begin
|
||||||
|
Boundary := bound;
|
||||||
|
i := ExtractPart(l, i);
|
||||||
|
DecodePart;
|
||||||
|
end;
|
||||||
|
until i >= l.Count - 2;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
x := AddPart;
|
||||||
|
with TMimePart(PartList[x]) do
|
||||||
|
begin
|
||||||
|
ExtractPart(l, 0);
|
||||||
|
DecodePart;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
m.Free;
|
||||||
|
l.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
917
mimepart.pas
917
mimepart.pas
File diff suppressed because it is too large
Load Diff
273
pingsend.pas
273
pingsend.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.000.000 |
|
| Project : Delphree - Synapse | 002.001.000 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: PING sender |
|
| Content: PING sender |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -14,7 +14,7 @@
|
|||||||
| The Original Code is Synapse Delphi Library. |
|
| The Original Code is Synapse Delphi Library. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
||||||
| Portions created by Lukas Gebauer are Copyright (c)2000. |
|
| Portions created by Lukas Gebauer are Copyright (c)2000,2001. |
|
||||||
| All Rights Reserved. |
|
| All Rights Reserved. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Contributor(s): |
|
| Contributor(s): |
|
||||||
@ -25,27 +25,12 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
See 'winsock2.txt' file in distribute package!
|
||||||
Remember, this unit work only on Linux or Windows with Winsock2!
|
|
||||||
(on Win98 and WinNT 4.0 or higher)
|
|
||||||
If you must use this unit on Win95, download Wínsock2 from Microsoft
|
|
||||||
and distribute it with your application!
|
|
||||||
|
|
||||||
In spite of I use Winsock level version 1.1, RAW sockets work in this level only
|
|
||||||
if Winsock2 is installed on your computer!!!
|
|
||||||
|
|
||||||
On WinNT standardly RAW sockets work if program is running under user with
|
|
||||||
administrators provilegies. To use RAW sockets under another users, you must
|
|
||||||
create the following registry variable and set its value to DWORD 1:
|
|
||||||
|
|
||||||
HKLM\System\CurrentControlSet\Services\Afd\Parameters\DisableRawSecurity
|
|
||||||
|
|
||||||
After you change the registry, you need to restart your computer!
|
|
||||||
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
{$Q-}
|
{$Q-}
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit PINGsend;
|
unit PINGsend;
|
||||||
|
|
||||||
@ -53,159 +38,183 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
libc,
|
Libc,
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
windows,
|
Windows,
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
synsock, SysUtils, blcksck2, Synautil;
|
SysUtils,
|
||||||
|
synsock, blcksock, SynaUtil;
|
||||||
|
|
||||||
const
|
const
|
||||||
ICMP_ECHO=8;
|
ICMP_ECHO = 8;
|
||||||
ICMP_ECHOREPLY=0;
|
ICMP_ECHOREPLY = 0;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
TIcmpEchoHeader = record
|
||||||
|
i_type: Byte;
|
||||||
|
i_code: Byte;
|
||||||
|
i_checkSum: Word;
|
||||||
|
i_Id: Word;
|
||||||
|
i_seq: Word;
|
||||||
|
TimeStamp: ULONG;
|
||||||
|
end;
|
||||||
|
|
||||||
TIcmpEchoHeader = Record
|
TPINGSend = class(TObject)
|
||||||
i_type : Byte;
|
|
||||||
i_code : Byte;
|
|
||||||
i_checkSum : Word;
|
|
||||||
i_Id : Word;
|
|
||||||
i_seq : Word;
|
|
||||||
TimeStamp : ULong;
|
|
||||||
End;
|
|
||||||
|
|
||||||
TPINGSend=class(TObject)
|
|
||||||
private
|
private
|
||||||
Sock:TICMPBlockSocket;
|
FSock: TICMPBlockSocket;
|
||||||
Buffer:string;
|
FBuffer: string;
|
||||||
seq:integer;
|
FSeq: Integer;
|
||||||
id:integer;
|
FId: Integer;
|
||||||
function checksum:integer;
|
FTimeout: Integer;
|
||||||
function GetTick:cardinal;
|
FPacketSize: Integer;
|
||||||
|
FPingTime: Integer;
|
||||||
|
function Checksum: Integer;
|
||||||
|
function GetTick: Cardinal;
|
||||||
|
function ReadPacket: Boolean;
|
||||||
public
|
public
|
||||||
timeout:integer;
|
function Ping(const Host: string): Boolean;
|
||||||
PacketSize:integer;
|
|
||||||
PingTime:integer;
|
|
||||||
function ping(host:string):Boolean;
|
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
end;
|
published
|
||||||
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
|
property PacketSize: Integer read FPacketSize Write FPacketSize;
|
||||||
|
property PingTime: Integer read FPingTime;
|
||||||
|
end;
|
||||||
|
|
||||||
function PingHost(host:string):integer;
|
function PingHost(const Host: string): Integer;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{TPINGSend.Create}
|
constructor TPINGSend.Create;
|
||||||
Constructor TPINGSend.Create;
|
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
sock:=TICMPBlockSocket.create;
|
FSock := TICMPBlockSocket.Create;
|
||||||
sock.CreateSocket;
|
FSock.CreateSocket;
|
||||||
timeout:=5000;
|
FTimeout := 5000;
|
||||||
packetsize:=32;
|
FPacketSize := 32;
|
||||||
seq:=0;
|
FSeq := 0;
|
||||||
|
Randomize;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPINGSend.Destroy}
|
destructor TPINGSend.Destroy;
|
||||||
Destructor TPINGSend.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Sock.free;
|
FSock.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPINGSend.ping}
|
function TPINGSend.ReadPacket: Boolean;
|
||||||
function TPINGSend.ping(host:string):Boolean;
|
|
||||||
var
|
var
|
||||||
PIPHeader:^TIPHeader;
|
x: Integer;
|
||||||
IpHdrLen:Integer;
|
|
||||||
PIcmpEchoHeader:^TICMPEchoHeader;
|
|
||||||
n,x:integer;
|
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := FSock.CanRead(FTimeout);
|
||||||
sock.connect(host,'0');
|
if Result then
|
||||||
Buffer:=StringOfChar(#0,SizeOf(TICMPEchoHeader)+packetSize);
|
begin
|
||||||
PIcmpEchoHeader := Pointer(Buffer);
|
x := FSock.WaitingData;
|
||||||
With PIcmpEchoHeader^ Do Begin
|
SetLength(FBuffer, x);
|
||||||
i_type:=ICMP_ECHO;
|
FSock.RecvBuffer(Pointer(FBuffer), x);
|
||||||
i_code:=0;
|
|
||||||
i_CheckSum:=0;
|
|
||||||
id:=Random(32767);
|
|
||||||
i_Id:=id;
|
|
||||||
TimeStamp:=GetTick;
|
|
||||||
Inc(Seq);
|
|
||||||
i_Seq:=Seq;
|
|
||||||
for n:=Succ(SizeOf(TicmpEchoHeader)) to Length(Buffer) do
|
|
||||||
Buffer[n]:=#$55;
|
|
||||||
i_CheckSum:=CheckSum;
|
|
||||||
end;
|
end;
|
||||||
sock.sendString(Buffer);
|
|
||||||
if sock.canread(timeout)
|
|
||||||
then begin
|
|
||||||
x:=sock.waitingdata;
|
|
||||||
setlength(Buffer,x);
|
|
||||||
sock.recvbuffer(Pointer(Buffer),x);
|
|
||||||
PIpHeader:=Pointer(Buffer);
|
|
||||||
IpHdrLen:=(PIpHeader^.VerLen and $0F)*4;
|
|
||||||
PIcmpEchoHeader:=@Buffer[IpHdrLen+1];
|
|
||||||
if (PIcmpEchoHeader^.i_type=ICMP_ECHOREPLY)
|
|
||||||
// Linux return from localhost ECHO instead ECHOREPLY???
|
|
||||||
or (PIcmpEchoHeader^.i_type=ICMP_ECHO) then
|
|
||||||
if (PIcmpEchoHeader^.i_id=id) then
|
|
||||||
begin
|
|
||||||
PingTime:=GetTick-PIcmpEchoHeader^.TimeStamp;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPINGSend.checksum}
|
function TPINGSend.Ping(const Host: string): Boolean;
|
||||||
function TPINGSend.checksum:integer;
|
|
||||||
type
|
|
||||||
tWordArray=Array[0..0] Of Word;
|
|
||||||
var
|
var
|
||||||
PWordArray:^TWordArray;
|
IPHeadPtr: ^TIPHeader;
|
||||||
CkSum:Dword;
|
IpHdrLen: Integer;
|
||||||
Num,Remain:Integer;
|
IcmpEchoHeaderPtr: ^TICMPEchoHeader;
|
||||||
n:Integer;
|
n: Integer;
|
||||||
|
t: Boolean;
|
||||||
begin
|
begin
|
||||||
Num:=length(Buffer) div 2;
|
Result := False;
|
||||||
Remain:=length(Buffer) mod 2;
|
FSock.Connect(Host, '0');
|
||||||
PWordArray:=Pointer(Buffer);
|
FBuffer := StringOfChar(#0, SizeOf(TICMPEchoHeader) + FPacketSize);
|
||||||
CkSum := 0;
|
IcmpEchoHeaderPtr := Pointer(FBuffer);
|
||||||
for n:=0 to Num-1 do
|
with IcmpEchoHeaderPtr^ do
|
||||||
CkSum:=CkSum+PWordArray^[n];
|
begin
|
||||||
if Remain<>0 then
|
i_type := ICMP_ECHO;
|
||||||
CkSum:=CkSum+ord(Buffer[Length(Buffer)]);
|
i_code := 0;
|
||||||
CkSum:=(CkSum shr 16)+(CkSum and $FFFF);
|
i_CheckSum := 0;
|
||||||
CkSum:=CkSum+(CkSum shr 16);
|
FId := Random(32767);
|
||||||
Result:=Word(not CkSum);
|
i_Id := FId;
|
||||||
|
TimeStamp := GetTick;
|
||||||
|
Inc(FSeq);
|
||||||
|
i_Seq := FSeq;
|
||||||
|
for n := Succ(SizeOf(TIcmpEchoHeader)) to Length(FBuffer) do
|
||||||
|
FBuffer[n] := #$55;
|
||||||
|
i_CheckSum := CheckSum;
|
||||||
|
end;
|
||||||
|
FSock.SendString(FBuffer);
|
||||||
|
repeat
|
||||||
|
t := ReadPacket;
|
||||||
|
if not t then
|
||||||
|
break;
|
||||||
|
IPHeadPtr := Pointer(FBuffer);
|
||||||
|
IpHdrLen := (IPHeadPtr^.VerLen and $0F) * 4;
|
||||||
|
IcmpEchoHeaderPtr := @FBuffer[IpHdrLen + 1];
|
||||||
|
until IcmpEchoHeaderPtr^.i_type <> ICMP_ECHO;
|
||||||
|
//it discard sometimes possible 'echoes' of previosly sended packet...
|
||||||
|
if t then
|
||||||
|
if (IcmpEchoHeaderPtr^.i_type = ICMP_ECHOREPLY) then
|
||||||
|
if (IcmpEchoHeaderPtr^.i_id = FId) then
|
||||||
|
begin
|
||||||
|
FPingTime := GetTick - IcmpEchoHeaderPtr^.TimeStamp;
|
||||||
|
Result := True;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPINGSend.GetTick}
|
function TPINGSend.Checksum: Integer;
|
||||||
function TPINGSend.GetTick:cardinal;
|
type
|
||||||
|
TWordArray = array[0..0] of Word;
|
||||||
|
var
|
||||||
|
WordArr: ^TWordArray;
|
||||||
|
CkSum: DWORD;
|
||||||
|
Num, Remain: Integer;
|
||||||
|
n: Integer;
|
||||||
begin
|
begin
|
||||||
{$IFDEF LINUX}
|
Num := Length(FBuffer) div 2;
|
||||||
result:=clock div (CLOCKS_PER_SEC div 1000);
|
Remain := Length(FBuffer) mod 2;
|
||||||
{$ELSE}
|
WordArr := Pointer(FBuffer);
|
||||||
result:=windows.GetTickCount;
|
CkSum := 0;
|
||||||
{$ENDIF}
|
for n := 0 to Num - 1 do
|
||||||
|
CkSum := CkSum + WordArr^[n];
|
||||||
|
if Remain <> 0 then
|
||||||
|
CkSum := CkSum + Ord(FBuffer[Length(FBuffer)]);
|
||||||
|
CkSum := (CkSum shr 16) + (CkSum and $FFFF);
|
||||||
|
CkSum := CkSum + (CkSum shr 16);
|
||||||
|
Result := Word(not CkSum);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF LINUX}
|
||||||
|
|
||||||
|
function TPINGSend.GetTick: Cardinal;
|
||||||
|
var
|
||||||
|
Stamp: TTimeStamp;
|
||||||
|
begin
|
||||||
|
Stamp := DateTimeToTimeStamp(Now);
|
||||||
|
Result := Stamp.Time;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ELSE}
|
||||||
|
|
||||||
|
function TPINGSend.GetTick: Cardinal;
|
||||||
|
begin
|
||||||
|
Result := Windows.GetTickCount;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
function PingHost(host:string):integer;
|
function PingHost(const Host: string): Integer;
|
||||||
var
|
|
||||||
ping:TPINGSend;
|
|
||||||
begin
|
begin
|
||||||
ping:=TPINGSend.Create;
|
with TPINGSend.Create do
|
||||||
try
|
try
|
||||||
if ping.ping(host)
|
if Ping(Host) then
|
||||||
then Result:=ping.pingtime
|
Result := PingTime
|
||||||
else Result:=-1;
|
else
|
||||||
|
Result := -1;
|
||||||
finally
|
finally
|
||||||
ping.Free;
|
Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
349
pop3send.pas
349
pop3send.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 001.001.000 |
|
| Project : Delphree - Synapse | 001.001.001 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: POP3 client |
|
| Content: POP3 client |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -23,252 +23,239 @@
|
|||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit POP3send;
|
unit POP3send;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Blcksock, sysutils, classes, SynaUtil, SynaCode;
|
SysUtils, Classes,
|
||||||
|
blcksock, SynaUtil, SynaCode;
|
||||||
|
|
||||||
const
|
const
|
||||||
CRLF=#13+#10;
|
cPop3Protocol = 'pop3';
|
||||||
|
|
||||||
type
|
type
|
||||||
TPOP3AuthType = (POP3AuthAll,POP3AuthLogin,POP3AuthAPOP);
|
TPOP3AuthType = (POP3AuthAll, POP3AuthLogin, POP3AuthAPOP);
|
||||||
|
|
||||||
TPOP3Send = class
|
TPOP3Send = class(TObject)
|
||||||
private
|
private
|
||||||
Sock:TTCPBlockSocket;
|
FSock: TTCPBlockSocket;
|
||||||
function ReadResult(full:boolean):integer;
|
FTimeout: Integer;
|
||||||
function Connect:Boolean;
|
FPOP3Host: string;
|
||||||
|
FPOP3Port: string;
|
||||||
|
FResultCode: Integer;
|
||||||
|
FResultString: string;
|
||||||
|
FFullResult: TStringList;
|
||||||
|
FUsername: string;
|
||||||
|
FPassword: string;
|
||||||
|
FStatCount: Integer;
|
||||||
|
FStatSize: Integer;
|
||||||
|
FTimeStamp: string;
|
||||||
|
FAuthType: TPOP3AuthType;
|
||||||
|
function ReadResult(Full: Boolean): Integer;
|
||||||
|
function Connect: Boolean;
|
||||||
|
function AuthLogin: Boolean;
|
||||||
|
function AuthApop: Boolean;
|
||||||
public
|
public
|
||||||
timeout:integer;
|
constructor Create;
|
||||||
POP3Host:string;
|
destructor Destroy; override;
|
||||||
POP3Port:string;
|
function Login: Boolean;
|
||||||
ResultCode:integer;
|
procedure Logout;
|
||||||
ResultString:string;
|
function Reset: Boolean;
|
||||||
FullResult:TStringList;
|
function NoOp: Boolean;
|
||||||
Username:string;
|
function Stat: Boolean;
|
||||||
Password:string;
|
function List(Value: Integer): Boolean;
|
||||||
StatCount:integer;
|
function Retr(Value: Integer): Boolean;
|
||||||
StatSize:integer;
|
function Dele(Value: Integer): Boolean;
|
||||||
TimeStamp:string;
|
function Top(Value, Maxlines: Integer): Boolean;
|
||||||
AuthType:TPOP3AuthType;
|
function Uidl(Value: Integer): Boolean;
|
||||||
Constructor Create;
|
published
|
||||||
Destructor Destroy; override;
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
function AuthLogin:Boolean;
|
property POP3Host: string read FPOP3Host Write FPOP3Host;
|
||||||
function AuthApop:Boolean;
|
property POP3Port: string read FPOP3Port Write FPOP3Port;
|
||||||
function login:Boolean;
|
property ResultCode: Integer read FResultCode;
|
||||||
procedure logout;
|
property ResultString: string read FResultString;
|
||||||
function reset:Boolean;
|
property FullResult: TStringList read FFullResult;
|
||||||
function noop:Boolean;
|
property Username: string read FUsername Write FUsername;
|
||||||
function stat:Boolean;
|
property Password: string read FPassword Write FPassword;
|
||||||
function list(value:integer):Boolean;
|
property StatCount: Integer read FStatCount;
|
||||||
function retr(value:integer):Boolean;
|
property StatSize: Integer read FStatSize;
|
||||||
function dele(value:integer):Boolean;
|
property TimeStamp: string read FTimeStamp;
|
||||||
function top(value,maxlines:integer):Boolean;
|
property AuthType: TPOP3AuthType read FAuthType Write FAuthType;
|
||||||
function uidl(value:integer):Boolean;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{TPOP3Send.Create}
|
const
|
||||||
Constructor TPOP3Send.Create;
|
CRLF = #13#10;
|
||||||
|
|
||||||
|
constructor TPOP3Send.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
FullResult:=TStringList.create;
|
FFullResult := TStringList.Create;
|
||||||
sock:=TTCPBlockSocket.create;
|
FSock := TTCPBlockSocket.Create;
|
||||||
sock.CreateSocket;
|
FSock.CreateSocket;
|
||||||
timeout:=300000;
|
FTimeout := 300000;
|
||||||
POP3host:='localhost';
|
FPOP3host := cLocalhost;
|
||||||
POP3Port:='pop3';
|
FPOP3Port := cPop3Protocol;
|
||||||
Username:='';
|
FUsername := '';
|
||||||
Password:='';
|
FPassword := '';
|
||||||
StatCount:=0;
|
FStatCount := 0;
|
||||||
StatSize:=0;
|
FStatSize := 0;
|
||||||
AuthType:=POP3AuthAll;
|
FAuthType := POP3AuthAll;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.Destroy}
|
destructor TPOP3Send.Destroy;
|
||||||
Destructor TPOP3Send.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Sock.free;
|
FSock.Free;
|
||||||
FullResult.free;
|
FullResult.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.ReadResult}
|
function TPOP3Send.ReadResult(Full: Boolean): Integer;
|
||||||
function TPOP3Send.ReadResult(full:boolean):integer;
|
|
||||||
var
|
var
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:=0;
|
Result := 0;
|
||||||
FullResult.Clear;
|
FFullResult.Clear;
|
||||||
s:=sock.recvstring(timeout);
|
s := FSock.RecvString(FTimeout);
|
||||||
if pos('+OK',s)=1
|
if Pos('+OK', s) = 1 then
|
||||||
then result:=1;
|
Result := 1;
|
||||||
ResultString:=s;
|
FResultString := s;
|
||||||
if full and (result=1)then
|
if Full and (Result = 1) then
|
||||||
repeat
|
repeat
|
||||||
s:=sock.recvstring(timeout);
|
s := FSock.RecvString(FTimeout);
|
||||||
if s='.'
|
if s = '.' then
|
||||||
then break;
|
Break;
|
||||||
FullResult.add(s);
|
FFullResult.Add(s);
|
||||||
until sock.LastError<>0;
|
until FSock.LastError <> 0;
|
||||||
ResultCode:=Result;
|
FResultCode := Result;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.AuthLogin}
|
function TPOP3Send.AuthLogin: Boolean;
|
||||||
function TPOP3Send.AuthLogin:Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result := False;
|
||||||
Sock.SendString('USER '+username+CRLF);
|
FSock.SendString('USER ' + FUserName + CRLF);
|
||||||
if readresult(false)<>1 then Exit;
|
if ReadResult(False) <> 1 then
|
||||||
Sock.SendString('PASS '+password+CRLF);
|
Exit;
|
||||||
if readresult(false)<>1 then Exit;
|
FSock.SendString('PASS ' + FPassword + CRLF);
|
||||||
Result:=True;
|
Result := ReadResult(False) = 1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.AuthAPop}
|
function TPOP3Send.AuthAPOP: Boolean;
|
||||||
function TPOP3Send.AuthAPOP:Boolean;
|
|
||||||
var
|
var
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
s := StrToHex(MD5(FTimeStamp + FPassWord));
|
||||||
s:=StrToHex(MD5(TimeStamp+PassWord));
|
FSock.SendString('APOP ' + FUserName + ' ' + s + CRLF);
|
||||||
Sock.SendString('APOP '+username+' '+s+CRLF);
|
Result := ReadResult(False) = 1;
|
||||||
if readresult(false)<>1 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TPOP3Send.Connect: Boolean;
|
||||||
{TPOP3Send.Connect}
|
|
||||||
function TPOP3Send.Connect:Boolean;
|
|
||||||
begin
|
begin
|
||||||
//Do not call this function! It is calling by LOGIN method!
|
// Do not call this function! It is calling by LOGIN method!
|
||||||
Result:=false;
|
FStatCount := 0;
|
||||||
StatCount:=0;
|
FStatSize := 0;
|
||||||
StatSize:=0;
|
FSock.CloseSocket;
|
||||||
sock.CloseSocket;
|
FSock.LineBuffer := '';
|
||||||
sock.LineBuffer:='';
|
FSock.CreateSocket;
|
||||||
sock.CreateSocket;
|
FSock.Connect(POP3Host, POP3Port);
|
||||||
sock.Connect(POP3Host,POP3Port);
|
Result := FSock.LastError = 0;
|
||||||
if sock.lasterror<>0 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.login}
|
function TPOP3Send.Login: Boolean;
|
||||||
function TPOP3Send.login:Boolean;
|
|
||||||
var
|
var
|
||||||
s,s1:string;
|
s, s1: string;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := False;
|
||||||
TimeStamp:='';
|
FTimeStamp := '';
|
||||||
if not Connect then Exit;
|
if not Connect then
|
||||||
if readresult(false)<>1 then Exit;
|
Exit;
|
||||||
s:=separateright(Resultstring,'<');
|
if ReadResult(False) <> 1 then
|
||||||
if s<>Resultstring then
|
Exit;
|
||||||
begin
|
s := SeparateRight(FResultString, '<');
|
||||||
s1:=separateleft(s,'>');
|
if s <> FResultString then
|
||||||
if s1<>s
|
begin
|
||||||
then TimeStamp:='<'+s1+'>';
|
s1 := SeparateLeft(s, '>');
|
||||||
end;
|
if s1 <> s then
|
||||||
result:=false;
|
FTimeStamp := '<' + s1 + '>';
|
||||||
if (TimeStamp<>'') and not(AuthType=POP3AuthLogin)
|
end;
|
||||||
then result:=AuthApop;
|
Result := False;
|
||||||
if not(Result) and not(AuthType=POP3AuthAPOP)
|
if (FTimeStamp <> '') and not (FAuthType = POP3AuthLogin) then
|
||||||
then result:=AuthLogin;
|
Result := AuthApop;
|
||||||
|
if not Result and not (FAuthType = POP3AuthAPOP) then
|
||||||
|
Result := AuthLogin;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.logout}
|
procedure TPOP3Send.Logout;
|
||||||
procedure TPOP3Send.logout;
|
|
||||||
begin
|
begin
|
||||||
Sock.SendString('QUIT'+CRLF);
|
FSock.SendString('QUIT' + CRLF);
|
||||||
readresult(false);
|
ReadResult(False);
|
||||||
Sock.CloseSocket;
|
FSock.CloseSocket;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.reset}
|
function TPOP3Send.Reset: Boolean;
|
||||||
function TPOP3Send.reset:Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('RSET' + CRLF);
|
||||||
Sock.SendString('RSET'+CRLF);
|
Result := ReadResult(False) = 1;
|
||||||
if readresult(false)<>1 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.noop}
|
function TPOP3Send.NoOp: Boolean;
|
||||||
function TPOP3Send.noop:Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('NOOP' + CRLF);
|
||||||
Sock.SendString('NOOP'+CRLF);
|
Result := ReadResult(False) = 1;
|
||||||
if readresult(false)<>1 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.stat}
|
function TPOP3Send.Stat: Boolean;
|
||||||
function TPOP3Send.stat:Boolean;
|
|
||||||
var
|
var
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result := False;
|
||||||
Sock.SendString('STAT'+CRLF);
|
FSock.SendString('STAT' + CRLF);
|
||||||
if readresult(false)<>1 then Exit;
|
if ReadResult(False) <> 1 then
|
||||||
s:=separateright(ResultString,'+OK ');
|
Exit;
|
||||||
StatCount:=StrToIntDef(separateleft(s,' '),0);
|
s := SeparateRight(ResultString, '+OK ');
|
||||||
StatSize:=StrToIntDef(separateright(s,' '),0);
|
FStatCount := StrToIntDef(SeparateLeft(s, ' '), 0);
|
||||||
Result:=True;
|
FStatSize := StrToIntDef(SeparateRight(s, ' '), 0);
|
||||||
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.list}
|
function TPOP3Send.List(Value: Integer): Boolean;
|
||||||
function TPOP3Send.list(value:integer):Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
if Value = 0 then
|
||||||
if value=0
|
FSock.SendString('LIST' + CRLF)
|
||||||
then Sock.SendString('LIST'+CRLF)
|
else
|
||||||
else Sock.SendString('LIST '+IntToStr(value)+CRLF);
|
FSock.SendString('LIST ' + IntToStr(Value) + CRLF);
|
||||||
if readresult(value=0)<>1 then Exit;
|
Result := ReadResult(Value = 0) = 1;
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.retr}
|
function TPOP3Send.Retr(Value: Integer): Boolean;
|
||||||
function TPOP3Send.retr(value:integer):Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('RETR ' + IntToStr(Value) + CRLF);
|
||||||
Sock.SendString('RETR '+IntToStr(value)+CRLF);
|
Result := ReadResult(True) = 1;
|
||||||
if readresult(true)<>1 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.dele}
|
function TPOP3Send.Dele(Value: Integer): Boolean;
|
||||||
function TPOP3Send.dele(value:integer):Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('DELE ' + IntToStr(Value) + CRLF);
|
||||||
Sock.SendString('DELE '+IntToStr(value)+CRLF);
|
Result := ReadResult(False) = 1;
|
||||||
if readresult(false)<>1 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.top}
|
function TPOP3Send.Top(Value, Maxlines: Integer): Boolean;
|
||||||
function TPOP3Send.top(value,maxlines:integer):Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('TOP ' + IntToStr(Value) + ' ' + IntToStr(Maxlines) + CRLF);
|
||||||
Sock.SendString('TOP '+IntToStr(value)+' '+IntToStr(maxlines)+CRLF);
|
Result := ReadResult(True) = 1;
|
||||||
if readresult(true)<>1 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TPOP3Send.uidl}
|
function TPOP3Send.Uidl(Value: Integer): Boolean;
|
||||||
function TPOP3Send.uidl(value:integer):Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
if Value = 0 then
|
||||||
if value=0
|
FSock.SendString('UIDL' + CRLF)
|
||||||
then Sock.SendString('UIDL'+CRLF)
|
else
|
||||||
else Sock.SendString('UIDL '+IntToStr(value)+CRLF);
|
FSock.SendString('UIDL ' + IntToStr(Value) + CRLF);
|
||||||
if readresult(value=0)<>1 then Exit;
|
Result := ReadResult(Value = 0) = 1;
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
806
smtpsend.pas
806
smtpsend.pas
@ -1,11 +1,11 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.001.002 |
|
| Project : Delphree - Synapse | 002.001.003 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: SMTP client |
|
| Content: SMTP client |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are Subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a Copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
| Software distributed under the License is distributed on an "AS IS" basis, |
|
| Software distributed under the License is distributed on an "AS IS" basis, |
|
||||||
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
||||||
@ -23,485 +23,481 @@
|
|||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit SMTPsend;
|
unit SMTPsend;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Blcksock, sysutils, classes, SynaUtil, SynaCode;
|
SysUtils, Classes,
|
||||||
|
blcksock, SynaUtil, SynaCode;
|
||||||
|
|
||||||
const
|
const
|
||||||
CRLF=#13+#10;
|
cSmtpProtocol = 'smtp';
|
||||||
|
|
||||||
type
|
type
|
||||||
TSMTPSend = class
|
TSMTPSend = class(TObject)
|
||||||
private
|
private
|
||||||
Sock:TTCPBlockSocket;
|
FSock: TTCPBlockSocket;
|
||||||
procedure EnhancedCode(value:string);
|
FTimeout: Integer;
|
||||||
function ReadResult:integer;
|
FSMTPHost: string;
|
||||||
|
FSMTPPort: string;
|
||||||
|
FResultCode: Integer;
|
||||||
|
FResultString: string;
|
||||||
|
FFullResult: TStringList;
|
||||||
|
FESMTPcap: TStringList;
|
||||||
|
FESMTP: Boolean;
|
||||||
|
FUsername: string;
|
||||||
|
FPassword: string;
|
||||||
|
FAuthDone: Boolean;
|
||||||
|
FESMTPSize: Boolean;
|
||||||
|
FMaxSize: Integer;
|
||||||
|
FEnhCode1: Integer;
|
||||||
|
FEnhCode2: Integer;
|
||||||
|
FEnhCode3: Integer;
|
||||||
|
FSystemName: string;
|
||||||
|
procedure EnhancedCode(const Value: string);
|
||||||
|
function ReadResult: Integer;
|
||||||
|
function AuthLogin: Boolean;
|
||||||
|
function AuthCram: Boolean;
|
||||||
|
function Helo: Boolean;
|
||||||
|
function Ehlo: Boolean;
|
||||||
|
function Connect: Boolean;
|
||||||
public
|
public
|
||||||
timeout:integer;
|
constructor Create;
|
||||||
SMTPHost:string;
|
destructor Destroy; override;
|
||||||
SMTPPort:string;
|
function Login: Boolean;
|
||||||
ResultCode:integer;
|
procedure Logout;
|
||||||
ResultString:string;
|
function Reset: Boolean;
|
||||||
FullResult:TStringList;
|
function NoOp: Boolean;
|
||||||
ESMTPcap:TStringList;
|
function MailFrom(const Value: string; Size: Integer): Boolean;
|
||||||
ESMTP:boolean;
|
function MailTo(const Value: string): Boolean;
|
||||||
Username:string;
|
function MailData(const Value: Tstrings): Boolean;
|
||||||
Password:string;
|
function Etrn(const Value: string): Boolean;
|
||||||
AuthDone:boolean;
|
function Verify(const Value: string): Boolean;
|
||||||
ESMTPSize:boolean;
|
function EnhCodeString: string;
|
||||||
MaxSize:integer;
|
function FindCap(const Value: string): string;
|
||||||
EnhCode1:integer;
|
published
|
||||||
EnhCode2:integer;
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
EnhCode3:integer;
|
property SMTPHost: string read FSMTPHost Write FSMTPHost;
|
||||||
SystemName:string;
|
property SMTPPort: string read FSMTPPort Write FSMTPPort;
|
||||||
Constructor Create;
|
property ResultCode: Integer read FResultCode;
|
||||||
Destructor Destroy; override;
|
property ResultString: string read FResultString;
|
||||||
function AuthLogin:Boolean;
|
property FullResult: TStringList read FFullResult;
|
||||||
function AuthCram:Boolean;
|
property ESMTPcap: TStringList read FESMTPcap;
|
||||||
function Connect:Boolean;
|
property ESMTP: Boolean read FESMTP;
|
||||||
function Helo:Boolean;
|
property Username: string read FUsername Write FUsername;
|
||||||
function Ehlo:Boolean;
|
property Password: string read FPassword Write FPassword;
|
||||||
function login:Boolean;
|
property AuthDone: Boolean read FAuthDone;
|
||||||
procedure logout;
|
property ESMTPSize: Boolean read FESMTPSize;
|
||||||
function reset:Boolean;
|
property MaxSize: Integer read FMaxSize;
|
||||||
function noop:Boolean;
|
property EnhCode1: Integer read FEnhCode1;
|
||||||
function mailfrom(Value:string; size:integer):Boolean;
|
property EnhCode2: Integer read FEnhCode2;
|
||||||
function mailto(Value:string):Boolean;
|
property EnhCode3: Integer read FEnhCode3;
|
||||||
function maildata(Value:Tstrings):Boolean;
|
property SystemName: string read FSystemName Write FSystemName;
|
||||||
function etrn(Value:string):Boolean;
|
|
||||||
function verify(Value:string):Boolean;
|
|
||||||
function EnhCodeString:string;
|
|
||||||
function FindCap(value:string):string;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SendtoRaw
|
function SendToRaw(const MailFrom, MailTo, SMTPHost: string;
|
||||||
(mailfrom,mailto,SMTPHost:string;maildata:TStrings;Username,Password:string):Boolean;
|
const MailData: TStrings; const Username, Password: string): Boolean;
|
||||||
function Sendto
|
function SendTo(const MailFrom, MailTo, Subject, SMTPHost: string;
|
||||||
(mailfrom,mailto,subject,SMTPHost:string;maildata:TStrings):Boolean;
|
const MailData: TStrings): Boolean;
|
||||||
function SendtoEx
|
function SendToEx(const MailFrom, MailTo, Subject, SMTPHost: string;
|
||||||
(mailfrom,mailto,subject,SMTPHost:string;maildata:TStrings;Username,Password:string):Boolean;
|
const MailData: TStrings; const Username, Password: string): Boolean;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{TSMTPSend.Create}
|
const
|
||||||
Constructor TSMTPSend.Create;
|
CRLF = #13#10;
|
||||||
|
|
||||||
|
constructor TSMTPSend.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
FullResult:=TStringList.create;
|
FFullResult := TStringList.Create;
|
||||||
ESMTPcap:=TStringList.create;
|
FESMTPcap := TStringList.Create;
|
||||||
sock:=TTCPBlockSocket.create;
|
FSock := TTCPBlockSocket.Create;
|
||||||
sock.CreateSocket;
|
FSock.CreateSocket;
|
||||||
timeout:=300000;
|
FTimeout := 300000;
|
||||||
SMTPhost:='localhost';
|
FSMTPhost := cLocalhost;
|
||||||
SMTPPort:='smtp';
|
FSMTPPort := cSmtpProtocol;
|
||||||
Username:='';
|
FUsername := '';
|
||||||
Password:='';
|
FPassword := '';
|
||||||
SystemName:=sock.localname;
|
FSystemName := FSock.LocalName;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.Destroy}
|
destructor TSMTPSend.Destroy;
|
||||||
Destructor TSMTPSend.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Sock.free;
|
FSock.Free;
|
||||||
ESMTPcap.free;
|
FESMTPcap.Free;
|
||||||
FullResult.free;
|
FFullResult.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.EnhancedCode}
|
procedure TSMTPSend.EnhancedCode(const Value: string);
|
||||||
procedure TSMTPSend.EnhancedCode (value:string);
|
|
||||||
var
|
var
|
||||||
s,t:string;
|
s, t: string;
|
||||||
e1,e2,e3:integer;
|
e1, e2, e3: Integer;
|
||||||
begin
|
begin
|
||||||
EnhCode1:=0;
|
FEnhCode1 := 0;
|
||||||
EnhCode2:=0;
|
FEnhCode2 := 0;
|
||||||
EnhCode3:=0;
|
FEnhCode3 := 0;
|
||||||
s:=copy(value,5,length(value)-4);
|
s := Copy(Value, 5, Length(Value) - 4);
|
||||||
t:=separateleft(s,'.');
|
t := SeparateLeft(s, '.');
|
||||||
s:=separateright(s,'.');
|
s := SeparateRight(s, '.');
|
||||||
if t='' then exit;
|
if t = '' then
|
||||||
if length(t)>1 then exit;
|
Exit;
|
||||||
e1:=strtointdef(t,0);
|
if Length(t) > 1 then
|
||||||
if e1=0 then exit;
|
Exit;
|
||||||
t:=separateleft(s,'.');
|
e1 := StrToIntDef(t, 0);
|
||||||
s:=separateright(s,'.');
|
if e1 = 0 then
|
||||||
if t='' then exit;
|
Exit;
|
||||||
if length(t)>3 then exit;
|
t := SeparateLeft(s, '.');
|
||||||
e2:=strtointdef(t,0);
|
s := SeparateRight(s, '.');
|
||||||
t:=separateleft(s,' ');
|
if t = '' then
|
||||||
if t='' then exit;
|
Exit;
|
||||||
if length(t)>3 then exit;
|
if Length(t) > 3 then
|
||||||
e3:=strtointdef(t,0);
|
Exit;
|
||||||
EnhCode1:=e1;
|
e2 := StrToIntDef(t, 0);
|
||||||
EnhCode2:=e2;
|
t := SeparateLeft(s, ' ');
|
||||||
EnhCode3:=e3;
|
if t = '' then
|
||||||
|
Exit;
|
||||||
|
if Length(t) > 3 then
|
||||||
|
Exit;
|
||||||
|
e3 := StrToIntDef(t, 0);
|
||||||
|
FEnhCode1 := e1;
|
||||||
|
FEnhCode2 := e2;
|
||||||
|
FEnhCode3 := e3;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.ReadResult}
|
function TSMTPSend.ReadResult: Integer;
|
||||||
function TSMTPSend.ReadResult:integer;
|
|
||||||
var
|
var
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:=0;
|
Result := 0;
|
||||||
FullResult.Clear;
|
FFullResult.Clear;
|
||||||
repeat
|
repeat
|
||||||
s:=sock.recvstring(timeout);
|
s := FSock.RecvString(FTimeout);
|
||||||
ResultString:=s;
|
FResultString := s;
|
||||||
FullResult.add(s);
|
FFullResult.Add(s);
|
||||||
if sock.LastError<>0 then
|
if FSock.LastError <> 0 then
|
||||||
break;
|
Break;
|
||||||
until pos('-',s)<>4;
|
until Pos('-', s) <> 4;
|
||||||
s:=FullResult[0];
|
s := FFullResult[0];
|
||||||
if Length(s)>=3 then Result:=Strtointdef(Copy(s,1,3),0);
|
if Length(s) >= 3 then
|
||||||
ResultCode:=Result;
|
Result := StrToIntDef(Copy(s, 1, 3), 0);
|
||||||
|
FResultCode := Result;
|
||||||
EnhancedCode(s);
|
EnhancedCode(s);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.AuthLogin}
|
function TSMTPSend.AuthLogin: Boolean;
|
||||||
function TSMTPSend.AuthLogin:Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result := False;
|
||||||
Sock.SendString('AUTH LOGIN'+CRLF);
|
FSock.SendString('AUTH LOGIN' + CRLF);
|
||||||
if readresult<>334 then Exit;
|
if ReadResult <> 334 then
|
||||||
Sock.SendString(Encodebase64(username)+CRLF);
|
Exit;
|
||||||
if readresult<>334 then Exit;
|
FSock.SendString(EncodeBase64(FUsername) + CRLF);
|
||||||
Sock.SendString(Encodebase64(password)+CRLF);
|
if ReadResult <> 334 then
|
||||||
if readresult<>235 then Exit;
|
Exit;
|
||||||
Result:=True;
|
FSock.SendString(EncodeBase64(FPassword) + CRLF);
|
||||||
|
Result := ReadResult = 235;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.AuthCram}
|
function TSMTPSend.AuthCram: Boolean;
|
||||||
function TSMTPSend.AuthCram:Boolean;
|
|
||||||
var
|
var
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result := False;
|
||||||
Sock.SendString('AUTH CRAM-MD5'+CRLF);
|
FSock.SendString('AUTH CRAM-MD5' + CRLF);
|
||||||
if readresult<>334 then Exit;
|
if ReadResult <> 334 then
|
||||||
s:=copy(ResultString,5,length(ResultString)-4);
|
Exit;
|
||||||
s:=DecodeBase64(s);
|
s := Copy(FResultString, 5, Length(FResultString) - 4);
|
||||||
s:=HMAC_MD5(s,password);
|
s := DecodeBase64(s);
|
||||||
s:=Username+' '+strtohex(s);
|
s := HMAC_MD5(s, FPassword);
|
||||||
Sock.SendString(Encodebase64(s)+CRLF);
|
s := FUsername + ' ' + StrToHex(s);
|
||||||
if readresult<>235 then Exit;
|
FSock.SendString(EncodeBase64(s) + CRLF);
|
||||||
Result:=True;
|
Result := ReadResult = 235;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.Connect}
|
function TSMTPSend.Connect: Boolean;
|
||||||
function TSMTPSend.Connect:Boolean;
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.CloseSocket;
|
||||||
sock.CloseSocket;
|
FSock.CreateSocket;
|
||||||
sock.CreateSocket;
|
FSock.Connect(FSMTPHost, FSMTPPort);
|
||||||
sock.Connect(SMTPHost,SMTPPort);
|
Result := FSock.LastError = 0;
|
||||||
if sock.lasterror<>0 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.Helo}
|
function TSMTPSend.Helo: Boolean;
|
||||||
function TSMTPSend.Helo:Boolean;
|
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('HELO ' + FSystemName + CRLF);
|
||||||
Sock.SendString('HELO '+SystemName+CRLF);
|
x := ReadResult;
|
||||||
x:=ReadResult;
|
Result := (x >= 250) and (x <= 259);
|
||||||
if (x<250) or (x>259) then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.Ehlo}
|
function TSMTPSend.Ehlo: Boolean;
|
||||||
function TSMTPSend.Ehlo:Boolean;
|
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
FSock.SendString('EHLO ' + FSystemName + CRLF);
|
||||||
Sock.SendString('EHLO '+SystemName+CRLF);
|
x := ReadResult;
|
||||||
x:=ReadResult;
|
Result := (x >= 250) and (x <= 259);
|
||||||
if (x<250) or (x>259) then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSMTPSend.login}
|
function TSMTPSend.Login: Boolean;
|
||||||
function TSMTPSend.login:Boolean;
|
|
||||||
var
|
var
|
||||||
n:integer;
|
n: Integer;
|
||||||
auths:string;
|
auths: string;
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := False;
|
||||||
ESMTP:=true;
|
FESMTP := True;
|
||||||
AuthDone:=false;
|
FAuthDone := False;
|
||||||
ESMTPcap.clear;
|
FESMTPcap.clear;
|
||||||
ESMTPSize:=false;
|
FESMTPSize := False;
|
||||||
MaxSize:=0;
|
FMaxSize := 0;
|
||||||
if not Connect then Exit;
|
if not Connect then
|
||||||
if readresult<>220 then Exit;
|
Exit;
|
||||||
|
if ReadResult <> 220 then
|
||||||
|
Exit;
|
||||||
if not Ehlo then
|
if not Ehlo then
|
||||||
|
begin
|
||||||
|
FESMTP := False;
|
||||||
|
if not Helo then
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
Result := True;
|
||||||
|
if FESMTP then
|
||||||
|
begin
|
||||||
|
for n := 1 to FFullResult.Count - 1 do
|
||||||
|
FESMTPcap.Add(Copy(FFullResult[n], 5, Length(FFullResult[n]) - 4));
|
||||||
|
if not ((FUsername = '') and (FPassword = '')) then
|
||||||
begin
|
begin
|
||||||
ESMTP:=false;
|
s := FindCap('AUTH ');
|
||||||
if not Helo then exit;
|
if s = '' then
|
||||||
end;
|
s := FindCap('AUTH=');
|
||||||
Result:=True;
|
auths := UpperCase(s);
|
||||||
if ESMTP then
|
if s <> '' then
|
||||||
begin
|
|
||||||
for n:=1 to FullResult.count-1 do
|
|
||||||
ESMTPcap.add(Copy(FullResult[n],5,length(Fullresult[n])-4));
|
|
||||||
if not ((Username='') and (Password='')) then
|
|
||||||
begin
|
|
||||||
s:=FindCap('AUTH ');
|
|
||||||
if s=''
|
|
||||||
then s:=FindCap('AUTH=');
|
|
||||||
auths:=uppercase(s);
|
|
||||||
if s<>'' then
|
|
||||||
begin
|
|
||||||
if pos('CRAM-MD5',auths)>0
|
|
||||||
then AuthDone:=AuthCram;
|
|
||||||
if (pos('LOGIN',auths)>0) and (not authDone)
|
|
||||||
then AuthDone:=AuthLogin;
|
|
||||||
end;
|
|
||||||
if AuthDone
|
|
||||||
then Ehlo;
|
|
||||||
end;
|
|
||||||
s:=FindCap('SIZE');
|
|
||||||
if s<>'' then
|
|
||||||
begin
|
|
||||||
ESMTPsize:=true;
|
|
||||||
MaxSize:=StrToIntDef(copy(s,6,length(s)-5),0);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.logout}
|
|
||||||
procedure TSMTPSend.logout;
|
|
||||||
begin
|
|
||||||
Sock.SendString('QUIT'+CRLF);
|
|
||||||
readresult;
|
|
||||||
Sock.CloseSocket;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.reset}
|
|
||||||
function TSMTPSend.reset:Boolean;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
Sock.SendString('RSET'+CRLF);
|
|
||||||
if readresult<>250 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.noop}
|
|
||||||
function TSMTPSend.noop:Boolean;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
Sock.SendString('NOOP'+CRLF);
|
|
||||||
if readresult<>250 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{TSMTPSend.mailfrom}
|
|
||||||
function TSMTPSend.mailfrom(Value:string; size:integer):Boolean;
|
|
||||||
var
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
s:='MAIL FROM:<'+Value+'>';
|
|
||||||
if ESMTPsize and (size>0)
|
|
||||||
then s:=s+' SIZE='+IntToStr(size);
|
|
||||||
Sock.SendString(s+CRLF);
|
|
||||||
if readresult<>250 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.mailto}
|
|
||||||
function TSMTPSend.mailto(Value:string):Boolean;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
Sock.SendString('RCPT TO:<'+Value+'>'+CRLF);
|
|
||||||
if readresult<>250 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.maildata}
|
|
||||||
function TSMTPSend.maildata(Value:Tstrings):Boolean;
|
|
||||||
var
|
|
||||||
n:integer;
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
Sock.SendString('DATA'+CRLF);
|
|
||||||
if readresult<>354 then Exit;
|
|
||||||
for n:=0 to Value.Count-1 do
|
|
||||||
begin
|
|
||||||
s:=value[n];
|
|
||||||
if Length(s)>=1 then
|
|
||||||
if s[1]='.' then s:='.'+s;
|
|
||||||
Sock.SendString(s+CRLF);
|
|
||||||
end;
|
|
||||||
Sock.SendString('.'+CRLF);
|
|
||||||
if readresult<>250 then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.etrn}
|
|
||||||
function TSMTPSend.etrn(Value:string):Boolean;
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
Sock.SendString('ETRN '+Value+CRLF);
|
|
||||||
x:=ReadResult;
|
|
||||||
if (x<250) or (x>259) then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.verify}
|
|
||||||
function TSMTPSend.verify(Value:string):Boolean;
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
Sock.SendString('VRFY '+Value+CRLF);
|
|
||||||
x:=ReadResult;
|
|
||||||
if (x<250) or (x>259) then Exit;
|
|
||||||
Result:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.EnhCodeString}
|
|
||||||
function TSMTPSend.EnhCodeString:string;
|
|
||||||
var
|
|
||||||
s,t:string;
|
|
||||||
begin
|
|
||||||
s:=inttostr(EnhCode2)+'.'+inttostr(EnhCode3);
|
|
||||||
t:='';
|
|
||||||
if s='0.0' then t:='Other undefined Status';
|
|
||||||
if s='1.0' then t:='Other address status';
|
|
||||||
if s='1.1' then t:='Bad destination mailbox address';
|
|
||||||
if s='1.2' then t:='Bad destination system address';
|
|
||||||
if s='1.3' then t:='Bad destination mailbox address syntax';
|
|
||||||
if s='1.4' then t:='Destination mailbox address ambiguous';
|
|
||||||
if s='1.5' then t:='Destination mailbox address valid';
|
|
||||||
if s='1.6' then t:='Mailbox has moved';
|
|
||||||
if s='1.7' then t:='Bad sender''s mailbox address syntax';
|
|
||||||
if s='1.8' then t:='Bad sender''s system address';
|
|
||||||
if s='2.0' then t:='Other or undefined mailbox status';
|
|
||||||
if s='2.1' then t:='Mailbox disabled, not accepting messages';
|
|
||||||
if s='2.2' then t:='Mailbox full';
|
|
||||||
if s='2.3' then t:='Message length exceeds administrative limit';
|
|
||||||
if s='2.4' then t:='Mailing list expansion problem';
|
|
||||||
if s='3.0' then t:='Other or undefined mail system status';
|
|
||||||
if s='3.1' then t:='Mail system full';
|
|
||||||
if s='3.2' then t:='System not accepting network messages';
|
|
||||||
if s='3.3' then t:='System not capable of selected features';
|
|
||||||
if s='3.4' then t:='Message too big for system';
|
|
||||||
if s='3.5' then t:='System incorrectly configured';
|
|
||||||
if s='4.0' then t:='Other or undefined network or routing status';
|
|
||||||
if s='4.1' then t:='No answer from host';
|
|
||||||
if s='4.2' then t:='Bad connection';
|
|
||||||
if s='4.3' then t:='Routing server failure';
|
|
||||||
if s='4.4' then t:='Unable to route';
|
|
||||||
if s='4.5' then t:='Network congestion';
|
|
||||||
if s='4.6' then t:='Routing loop detected';
|
|
||||||
if s='4.7' then t:='Delivery time expired';
|
|
||||||
if s='5.0' then t:='Other or undefined protocol status';
|
|
||||||
if s='5.1' then t:='Invalid command';
|
|
||||||
if s='5.2' then t:='Syntax error';
|
|
||||||
if s='5.3' then t:='Too many recipients';
|
|
||||||
if s='5.4' then t:='Invalid command arguments';
|
|
||||||
if s='5.5' then t:='Wrong protocol version';
|
|
||||||
if s='6.0' then t:='Other or undefined media error';
|
|
||||||
if s='6.1' then t:='Media not supported';
|
|
||||||
if s='6.2' then t:='Conversion required and prohibited';
|
|
||||||
if s='6.3' then t:='Conversion required but not supported';
|
|
||||||
if s='6.4' then t:='Conversion with loss performed';
|
|
||||||
if s='6.5' then t:='Conversion failed';
|
|
||||||
if s='7.0' then t:='Other or undefined security status';
|
|
||||||
if s='7.1' then t:='Delivery not authorized, message refused';
|
|
||||||
if s='7.2' then t:='Mailing list expansion prohibited';
|
|
||||||
if s='7.3' then t:='Security conversion required but not possible';
|
|
||||||
if s='7.4' then t:='Security features not supported';
|
|
||||||
if s='7.5' then t:='Cryptographic failure';
|
|
||||||
if s='7.6' then t:='Cryptographic algorithm not supported';
|
|
||||||
if s='7.7' then t:='Message integrity failure';
|
|
||||||
s:='???-';
|
|
||||||
if EnhCode1=2 then s:='Success-';
|
|
||||||
if EnhCode1=4 then s:='Persistent Transient Failure-';
|
|
||||||
if EnhCode1=5 then s:='Permanent Failure-';
|
|
||||||
result:=s+t;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{TSMTPSend.FindCap}
|
|
||||||
function TSMTPSend.FindCap(value:string):string;
|
|
||||||
var
|
|
||||||
n:integer;
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
s:=uppercase(value);
|
|
||||||
result:='';
|
|
||||||
for n:=0 to ESMTPcap.count-1 do
|
|
||||||
if pos(s,uppercase(ESMTPcap[n]))=1 then
|
|
||||||
begin
|
begin
|
||||||
result:=ESMTPcap[n];
|
if Pos('CRAM-MD5', auths) > 0 then
|
||||||
break;
|
FAuthDone := AuthCram;
|
||||||
|
if (Pos('LOGIN', auths) > 0) and (not FauthDone) then
|
||||||
|
FAuthDone := AuthLogin;
|
||||||
end;
|
end;
|
||||||
|
if FAuthDone then
|
||||||
|
Ehlo;
|
||||||
|
end;
|
||||||
|
s := FindCap('SIZE');
|
||||||
|
if s <> '' then
|
||||||
|
begin
|
||||||
|
FESMTPsize := True;
|
||||||
|
FMaxSize := StrToIntDef(Copy(s, 6, Length(s) - 5), 0);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSMTPSend.Logout;
|
||||||
|
begin
|
||||||
|
FSock.SendString('QUIT' + CRLF);
|
||||||
|
ReadResult;
|
||||||
|
FSock.CloseSocket;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.Reset: Boolean;
|
||||||
|
begin
|
||||||
|
FSock.SendString('RSET' + CRLF);
|
||||||
|
Result := ReadResult = 250;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.NoOp: Boolean;
|
||||||
|
begin
|
||||||
|
FSock.SendString('NOOP' + CRLF);
|
||||||
|
Result := ReadResult = 250;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.MailFrom(const Value: string; Size: Integer): Boolean;
|
||||||
|
var
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
s := 'MAIL FROM:<' + Value + '>';
|
||||||
|
if FESMTPsize and (Size > 0) then
|
||||||
|
s := s + ' SIZE=' + IntToStr(Size);
|
||||||
|
FSock.SendString(s + CRLF);
|
||||||
|
Result := ReadResult = 250;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.MailTo(const Value: string): Boolean;
|
||||||
|
begin
|
||||||
|
FSock.SendString('RCPT TO:<' + Value + '>' + CRLF);
|
||||||
|
Result := ReadResult = 250;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.MailData(const Value: TStrings): Boolean;
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
FSock.SendString('DATA' + CRLF);
|
||||||
|
if ReadResult <> 354 then
|
||||||
|
Exit;
|
||||||
|
for n := 0 to Value.Count - 1 do
|
||||||
|
begin
|
||||||
|
s := Value[n];
|
||||||
|
if Length(s) >= 1 then
|
||||||
|
if s[1] = '.' then
|
||||||
|
s := '.' + s;
|
||||||
|
FSock.SendString(s + CRLF);
|
||||||
|
end;
|
||||||
|
FSock.SendString('.' + CRLF);
|
||||||
|
Result := ReadResult = 250;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.Etrn(const Value: string): Boolean;
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
begin
|
||||||
|
FSock.SendString('ETRN ' + Value + CRLF);
|
||||||
|
x := ReadResult;
|
||||||
|
Result := (x >= 250) and (x <= 259);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.Verify(const Value: string): Boolean;
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
begin
|
||||||
|
FSock.SendString('VRFY ' + Value + CRLF);
|
||||||
|
x := ReadResult;
|
||||||
|
Result := (x >= 250) and (x <= 259);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.EnhCodeString: string;
|
||||||
|
var
|
||||||
|
s, t: string;
|
||||||
|
begin
|
||||||
|
s := IntToStr(FEnhCode2) + '.' + IntToStr(FEnhCode3);
|
||||||
|
t := '';
|
||||||
|
if s = '0.0' then t := 'Other undefined Status';
|
||||||
|
if s = '1.0' then t := 'Other address status';
|
||||||
|
if s = '1.1' then t := 'Bad destination mailbox address';
|
||||||
|
if s = '1.2' then t := 'Bad destination system address';
|
||||||
|
if s = '1.3' then t := 'Bad destination mailbox address syntax';
|
||||||
|
if s = '1.4' then t := 'Destination mailbox address ambiguous';
|
||||||
|
if s = '1.5' then t := 'Destination mailbox address valid';
|
||||||
|
if s = '1.6' then t := 'Mailbox has moved';
|
||||||
|
if s = '1.7' then t := 'Bad sender''s mailbox address syntax';
|
||||||
|
if s = '1.8' then t := 'Bad sender''s system address';
|
||||||
|
if s = '2.0' then t := 'Other or undefined mailbox status';
|
||||||
|
if s = '2.1' then t := 'Mailbox disabled, not accepting messages';
|
||||||
|
if s = '2.2' then t := 'Mailbox full';
|
||||||
|
if s = '2.3' then t := 'Message Length exceeds administrative limit';
|
||||||
|
if s = '2.4' then t := 'Mailing list expansion problem';
|
||||||
|
if s = '3.0' then t := 'Other or undefined mail system status';
|
||||||
|
if s = '3.1' then t := 'Mail system full';
|
||||||
|
if s = '3.2' then t := 'System not accepting network messages';
|
||||||
|
if s = '3.3' then t := 'System not capable of selected features';
|
||||||
|
if s = '3.4' then t := 'Message too big for system';
|
||||||
|
if s = '3.5' then t := 'System incorrectly configured';
|
||||||
|
if s = '4.0' then t := 'Other or undefined network or routing status';
|
||||||
|
if s = '4.1' then t := 'No answer from host';
|
||||||
|
if s = '4.2' then t := 'Bad connection';
|
||||||
|
if s = '4.3' then t := 'Routing server failure';
|
||||||
|
if s = '4.4' then t := 'Unable to route';
|
||||||
|
if s = '4.5' then t := 'Network congestion';
|
||||||
|
if s = '4.6' then t := 'Routing loop detected';
|
||||||
|
if s = '4.7' then t := 'Delivery time expired';
|
||||||
|
if s = '5.0' then t := 'Other or undefined protocol status';
|
||||||
|
if s = '5.1' then t := 'Invalid command';
|
||||||
|
if s = '5.2' then t := 'Syntax error';
|
||||||
|
if s = '5.3' then t := 'Too many recipients';
|
||||||
|
if s = '5.4' then t := 'Invalid command arguments';
|
||||||
|
if s = '5.5' then t := 'Wrong protocol version';
|
||||||
|
if s = '6.0' then t := 'Other or undefined media error';
|
||||||
|
if s = '6.1' then t := 'Media not supported';
|
||||||
|
if s = '6.2' then t := 'Conversion required and prohibited';
|
||||||
|
if s = '6.3' then t := 'Conversion required but not supported';
|
||||||
|
if s = '6.4' then t := 'Conversion with loss performed';
|
||||||
|
if s = '6.5' then t := 'Conversion failed';
|
||||||
|
if s = '7.0' then t := 'Other or undefined security status';
|
||||||
|
if s = '7.1' then t := 'Delivery not authorized, message refused';
|
||||||
|
if s = '7.2' then t := 'Mailing list expansion prohibited';
|
||||||
|
if s = '7.3' then t := 'Security conversion required but not possible';
|
||||||
|
if s = '7.4' then t := 'Security features not supported';
|
||||||
|
if s = '7.5' then t := 'Cryptographic failure';
|
||||||
|
if s = '7.6' then t := 'Cryptographic algorithm not supported';
|
||||||
|
if s = '7.7' then t := 'Message integrity failure';
|
||||||
|
s := '???-';
|
||||||
|
if FEnhCode1 = 2 then s := 'Success-';
|
||||||
|
if FEnhCode1 = 4 then s := 'Persistent Transient Failure-';
|
||||||
|
if FEnhCode1 = 5 then s := 'Permanent Failure-';
|
||||||
|
Result := s + t;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSMTPSend.FindCap(const Value: string): string;
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
s := UpperCase(Value);
|
||||||
|
Result := '';
|
||||||
|
for n := 0 to FESMTPcap.Count - 1 do
|
||||||
|
if Pos(s, UpperCase(FESMTPcap[n])) = 1 then
|
||||||
|
begin
|
||||||
|
Result := FESMTPcap[n];
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
function SendtoRaw (mailfrom,mailto,SMTPHost:string;maildata:TStrings;
|
function SendToRaw(const MailFrom, MailTo, SMTPHost: string;
|
||||||
Username,Password:string):Boolean;
|
const MailData: TStrings; const Username, Password: string): Boolean;
|
||||||
var
|
var
|
||||||
SMTP:TSMTPSend;
|
SMTP: TSMTPSend;
|
||||||
size:integer;
|
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := False;
|
||||||
SMTP:=TSMTPSend.Create;
|
SMTP := TSMTPSend.Create;
|
||||||
try
|
try
|
||||||
SMTP.SMTPHost:=SMTPHost;
|
SMTP.SMTPHost := SMTPHost;
|
||||||
SMTP.Username:=Username;
|
SMTP.Username := Username;
|
||||||
SMTP.Password:=Password;
|
SMTP.Password := Password;
|
||||||
if not SMTP.login then Exit;
|
if SMTP.Login then
|
||||||
size:=length(maildata.text);
|
begin
|
||||||
if not SMTP.mailfrom(mailfrom,size) then Exit;
|
if SMTP.MailFrom(MailFrom, Length(MailData.Text)) then
|
||||||
if not SMTP.mailto(mailto) then Exit;
|
if SMTP.MailTo(MailTo) then
|
||||||
if not SMTP.maildata(Maildata) then Exit;
|
if SMTP.MailData(MailData) then
|
||||||
SMTP.logout;
|
Result := True;
|
||||||
Result:=True;
|
SMTP.Logout;
|
||||||
|
end;
|
||||||
finally
|
finally
|
||||||
SMTP.Free;
|
SMTP.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SendtoEx (mailfrom,mailto,subject,SMTPHost:string;maildata:TStrings;
|
function SendToEx(const MailFrom, MailTo, Subject, SMTPHost: string;
|
||||||
Username,Password:string):Boolean;
|
const MailData: TStrings; const Username, Password: string): Boolean;
|
||||||
var
|
var
|
||||||
t:TStrings;
|
t: TStrings;
|
||||||
begin
|
begin
|
||||||
// Result:=False;
|
t := TStringList.Create;
|
||||||
t:=TStringList.Create;
|
|
||||||
try
|
try
|
||||||
t.assign(Maildata);
|
t.Assign(MailData);
|
||||||
t.Insert(0,'');
|
t.Insert(0, '');
|
||||||
t.Insert(0,'x-mailer: Synapse - Delphi TCP/IP library by Lukas Gebauer');
|
t.Insert(0, 'x-mailer: Synapse - Delphi TCP/IP library by Lukas Gebauer');
|
||||||
t.Insert(0,'subject: '+subject);
|
t.Insert(0, 'subject: ' + Subject);
|
||||||
t.Insert(0,'date: '+Rfc822DateTime(now));
|
t.Insert(0, 'date: ' + Rfc822DateTime(now));
|
||||||
t.Insert(0,'to: '+mailto);
|
t.Insert(0, 'to: ' + MailTo);
|
||||||
t.Insert(0,'from: '+mailfrom);
|
t.Insert(0, 'from: ' + MailFrom);
|
||||||
Result:=SendToRaw(mailfrom,mailto,SMTPHost,t,Username,Password);
|
Result := SendToRaw(MailFrom, MailTo, SMTPHost, t, Username, Password);
|
||||||
finally
|
finally
|
||||||
t.Free;
|
t.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function Sendto
|
function SendTo(const MailFrom, MailTo, Subject, SMTPHost: string;
|
||||||
(mailfrom,mailto,subject,SMTPHost:string;maildata:TStrings):Boolean;
|
const MailData: TStrings): Boolean;
|
||||||
begin
|
begin
|
||||||
result:=SendToEx(mailfrom,mailto,subject,SMTPHost,maildata,'','');
|
Result := SendToEx(MailFrom, MailTo, Subject, SMTPHost, MailData, '', '');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
439
snmpsend.pas
439
snmpsend.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.003.001 |
|
| Project : Delphree - Synapse | 002.003.002 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: SNMP client |
|
| Content: SNMP client |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -25,201 +25,213 @@
|
|||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
{$Q-}
|
{$Q-}
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit SNMPSend;
|
unit SNMPSend;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
BlckSock, synautil, classes, sysutils, ASN1Util;
|
Classes, SysUtils,
|
||||||
|
blckSock, SynaUtil, ASN1Util;
|
||||||
|
|
||||||
const
|
const
|
||||||
|
cSnmpProtocol = '161';
|
||||||
|
|
||||||
//PDU type
|
//PDU type
|
||||||
PDUGetRequest=$a0;
|
PDUGetRequest = $A0;
|
||||||
PDUGetNextRequest=$a1;
|
PDUGetNextRequest = $A1;
|
||||||
PDUGetResponse=$a2;
|
PDUGetResponse = $A2;
|
||||||
PDUSetRequest=$a3;
|
PDUSetRequest = $A3;
|
||||||
PDUTrap=$a4;
|
PDUTrap = $A4;
|
||||||
|
|
||||||
//errors
|
//errors
|
||||||
ENoError=0;
|
ENoError = 0;
|
||||||
ETooBig=1;
|
ETooBig = 1;
|
||||||
ENoSuchName=2;
|
ENoSuchName = 2;
|
||||||
EBadValue=3;
|
EBadValue = 3;
|
||||||
EReadOnly=4;
|
EReadOnly = 4;
|
||||||
EGenErr=5;
|
EGenErr = 5;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
TSNMPMib = class(TObject)
|
||||||
TSNMPMib = class
|
|
||||||
OID: string;
|
|
||||||
Value: string;
|
|
||||||
ValueType: integer;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TSNMPRec=class(TObject)
|
|
||||||
public
|
|
||||||
version:integer;
|
|
||||||
community:string;
|
|
||||||
PDUType:integer;
|
|
||||||
ID:integer;
|
|
||||||
ErrorStatus:integer;
|
|
||||||
ErrorIndex:integer;
|
|
||||||
SNMPMibList: TList;
|
|
||||||
constructor Create;
|
|
||||||
destructor Destroy; override;
|
|
||||||
function DecodeBuf(Buffer:string):boolean;
|
|
||||||
function EncodeBuf:string;
|
|
||||||
procedure Clear;
|
|
||||||
procedure MIBAdd(MIB,Value:string; ValueType:integer);
|
|
||||||
procedure MIBdelete(Index:integer);
|
|
||||||
function MIBGet(MIB:string):string;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TSNMPSend=class(TObject)
|
|
||||||
private
|
private
|
||||||
Sock:TUDPBlockSocket;
|
FOID: string;
|
||||||
Buffer:string;
|
FValue: string;
|
||||||
|
FValueType: Integer;
|
||||||
|
published
|
||||||
|
property OID: string read FOID Write FOID;
|
||||||
|
property Value: string read FValue Write FValue;
|
||||||
|
property ValueType: Integer read FValueType Write FValueType;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TSNMPRec = class(TObject)
|
||||||
|
private
|
||||||
|
FVersion: Integer;
|
||||||
|
FCommunity: string;
|
||||||
|
FPDUType: Integer;
|
||||||
|
FID: Integer;
|
||||||
|
FErrorStatus: Integer;
|
||||||
|
FErrorIndex: Integer;
|
||||||
|
FSNMPMibList: TList;
|
||||||
public
|
public
|
||||||
Timeout:integer;
|
|
||||||
Host:string;
|
|
||||||
HostIP:string;
|
|
||||||
Query:TSNMPrec;
|
|
||||||
Reply:TSNMPrec;
|
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function DoIt:boolean;
|
function DecodeBuf(const Buffer: string): Boolean;
|
||||||
end;
|
function EncodeBuf: string;
|
||||||
|
procedure Clear;
|
||||||
|
procedure MIBAdd(const MIB, Value: string; ValueType: Integer);
|
||||||
|
procedure MIBDelete(Index: Integer);
|
||||||
|
function MIBGet(const MIB: string): string;
|
||||||
|
published
|
||||||
|
property Version: Integer read FVersion Write FVersion;
|
||||||
|
property Community: string read FCommunity Write FCommunity;
|
||||||
|
property PDUType: Integer read FPDUType Write FPDUType;
|
||||||
|
property ID: Integer read FID Write FID;
|
||||||
|
property ErrorStatus: Integer read FErrorStatus Write FErrorStatus;
|
||||||
|
property ErrorIndex: Integer read FErrorIndex Write FErrorIndex;
|
||||||
|
property SNMPMibList: TList read FSNMPMibList;
|
||||||
|
end;
|
||||||
|
|
||||||
function SNMPget (Oid, Community, SNMPHost:string; var Value:string):Boolean;
|
TSNMPSend = class(TObject)
|
||||||
function SNMPSet (Oid, Community, SNMPHost, Value: string; ValueType: integer): boolean;
|
private
|
||||||
|
FSock: TUDPBlockSocket;
|
||||||
|
FBuffer: string;
|
||||||
|
FTimeout: Integer;
|
||||||
|
FHost: string;
|
||||||
|
FHostIP: string;
|
||||||
|
FQuery: TSNMPRec;
|
||||||
|
FReply: TSNMPRec;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
function DoIt: Boolean;
|
||||||
|
published
|
||||||
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
|
property Host: string read FHost Write FHost;
|
||||||
|
property HostIP: string read FHostIP;
|
||||||
|
property Query: TSNMPRec read FQuery;
|
||||||
|
property Reply: TSNMPRec read FReply;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SNMPGet(const Oid, Community, SNMPHost: string;
|
||||||
|
var Value: string): Boolean;
|
||||||
|
function SNMPSet(const Oid, Community, SNMPHost, Value: string;
|
||||||
|
ValueType: Integer): Boolean;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{TSNMPRec.Create}
|
|
||||||
constructor TSNMPRec.Create;
|
constructor TSNMPRec.Create;
|
||||||
begin
|
begin
|
||||||
inherited create;
|
inherited Create;
|
||||||
SNMPMibList := TList.create;
|
FSNMPMibList := TList.Create;
|
||||||
id:=1;
|
id := 1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.Destroy}
|
|
||||||
destructor TSNMPRec.Destroy;
|
destructor TSNMPRec.Destroy;
|
||||||
var
|
var
|
||||||
i:integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to SNMPMibList.count - 1 do
|
for i := 0 to FSNMPMibList.Count - 1 do
|
||||||
TSNMPMib(SNMPMibList[i]).Free;
|
TSNMPMib(FSNMPMibList[i]).Free;
|
||||||
SNMPMibList.free;
|
FSNMPMibList.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.DecodeBuf}
|
function TSNMPRec.DecodeBuf(const Buffer: string): Boolean;
|
||||||
function TSNMPRec.DecodeBuf(Buffer:string):boolean;
|
|
||||||
var
|
var
|
||||||
Pos:integer;
|
Pos: Integer;
|
||||||
endpos:integer;
|
EndPos: Integer;
|
||||||
sm,sv:string;
|
sm, sv: string;
|
||||||
svt: integer;
|
Svt: Integer;
|
||||||
begin
|
begin
|
||||||
result:=false;
|
Result := False;
|
||||||
if length(buffer)<2
|
if Length(Buffer) < 2 then
|
||||||
then exit;
|
Exit;
|
||||||
if (ord(buffer[1]) and $20)=0
|
if (Ord(Buffer[1]) and $20) = 0 then
|
||||||
then exit;
|
Exit;
|
||||||
Pos:=2;
|
Pos := 2;
|
||||||
Endpos:=ASNDecLen(Pos,buffer);
|
EndPos := ASNDecLen(Pos, Buffer);
|
||||||
if length(buffer)<(Endpos+2)
|
if Length(Buffer) < (EndPos + 2) then
|
||||||
then exit;
|
Exit;
|
||||||
Self.version:=StrToIntDef(ASNItem(Pos,buffer,svt),0);
|
Self.FVersion := StrToIntDef(ASNItem(Pos, Buffer, Svt), 0);
|
||||||
Self.community:=ASNItem(Pos,buffer,svt);
|
Self.FCommunity := ASNItem(Pos, Buffer, Svt);
|
||||||
Self.PDUType:=StrToIntDef(ASNItem(Pos,buffer,svt),0);
|
Self.FPDUType := StrToIntDef(ASNItem(Pos, Buffer, Svt), 0);
|
||||||
Self.ID:=StrToIntDef(ASNItem(Pos,buffer,svt),0);
|
Self.FID := StrToIntDef(ASNItem(Pos, Buffer, Svt), 0);
|
||||||
Self.ErrorStatus:=StrToIntDef(ASNItem(Pos,buffer,svt),0);
|
Self.FErrorStatus := StrToIntDef(ASNItem(Pos, Buffer, Svt), 0);
|
||||||
Self.ErrorIndex:=StrToIntDef(ASNItem(Pos,buffer,svt),0);
|
Self.FErrorIndex := StrToIntDef(ASNItem(Pos, Buffer, Svt), 0);
|
||||||
ASNItem(Pos,buffer,svt);
|
ASNItem(Pos, Buffer, Svt);
|
||||||
while Pos<Endpos do
|
while Pos < EndPos do
|
||||||
begin
|
begin
|
||||||
ASNItem(Pos,buffer,svt);
|
ASNItem(Pos, Buffer, Svt);
|
||||||
Sm:=ASNItem(Pos,buffer,svt);
|
Sm := ASNItem(Pos, Buffer, Svt);
|
||||||
Sv:=ASNItem(Pos,buffer,svt);
|
Sv := ASNItem(Pos, Buffer, Svt);
|
||||||
Self.MIBadd(sm,sv, svt);
|
Self.MIBAdd(sm, sv, Svt);
|
||||||
end;
|
end;
|
||||||
result:=true;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.EncodeBuf}
|
function TSNMPRec.EncodeBuf: string;
|
||||||
function TSNMPRec.EncodeBuf:string;
|
|
||||||
var
|
var
|
||||||
data,s:string;
|
data, s: string;
|
||||||
SNMPMib: TSNMPMib;
|
SNMPMib: TSNMPMib;
|
||||||
n:integer;
|
n: Integer;
|
||||||
begin
|
begin
|
||||||
data:='';
|
data := '';
|
||||||
for n:=0 to SNMPMibList.Count-1 do
|
for n := 0 to FSNMPMibList.Count - 1 do
|
||||||
begin
|
begin
|
||||||
SNMPMib := SNMPMibList[n];
|
SNMPMib := FSNMPMibList[n];
|
||||||
case (SNMPMib.ValueType) of
|
case SNMPMib.ValueType of
|
||||||
ASN1_INT:
|
ASN1_INT:
|
||||||
begin
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID)
|
ASNObject(ASNEncInt(StrToIntDef(SNMPMib.Value, 0)), SNMPMib.ValueType);
|
||||||
+ASNObject(ASNEncInt(strToIntDef(SNMPMib.Value,0)),SNMPMib.ValueType);
|
ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS:
|
||||||
end;
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS:
|
ASNObject(ASNEncUInt(StrToIntDef(SNMPMib.Value, 0)), SNMPMib.ValueType);
|
||||||
begin
|
ASN1_OBJID:
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID)
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
+ASNObject(ASNEncUInt(strToIntDef(SNMPMib.Value,0)),SNMPMib.ValueType);
|
ASNObject(MibToID(SNMPMib.Value), SNMPMib.ValueType);
|
||||||
end;
|
ASN1_IPADDR:
|
||||||
ASN1_OBJID:
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
begin
|
ASNObject(IPToID(SNMPMib.Value), SNMPMib.ValueType);
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject(MibToID(SNMPMib.Value),SNMPMib.ValueType);
|
ASN1_NULL:
|
||||||
end;
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
ASN1_IPADDR:
|
ASNObject('', ASN1_NULL);
|
||||||
begin
|
else
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject(IPToID(SNMPMib.Value),SNMPMib.ValueType);
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
end;
|
ASNObject(SNMPMib.Value, SNMPMib.ValueType);
|
||||||
ASN1_NULL:
|
|
||||||
begin
|
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject('',ASN1_NULL);
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject(SNMPMib.Value,SNMPMib.ValueType);
|
|
||||||
end;
|
|
||||||
data := data + ASNObject(s, ASN1_SEQ);
|
|
||||||
end;
|
end;
|
||||||
data:=ASNObject(data,ASN1_SEQ);
|
data := data + ASNObject(s, ASN1_SEQ);
|
||||||
data:=ASNObject(ASNEncInt(Self.ID),ASN1_INT)
|
end;
|
||||||
+ASNObject(ASNEncInt(Self.ErrorStatus),ASN1_INT)
|
data := ASNObject(data, ASN1_SEQ);
|
||||||
+ASNObject(ASNEncInt(Self.ErrorIndex),ASN1_INT)
|
data := ASNObject(ASNEncInt(Self.FID), ASN1_INT) +
|
||||||
+data;
|
ASNObject(ASNEncInt(Self.FErrorStatus), ASN1_INT) +
|
||||||
data:=ASNObject(ASNEncInt(Self.Version),ASN1_INT)
|
ASNObject(ASNEncInt(Self.FErrorIndex), ASN1_INT) +
|
||||||
+ASNObject(Self.community,ASN1_OCTSTR)
|
data;
|
||||||
+ASNObject(data,Self.PDUType);
|
data := ASNObject(ASNEncInt(Self.FVersion), ASN1_INT) +
|
||||||
data:=ASNObject(data,ASN1_SEQ);
|
ASNObject(Self.FCommunity, ASN1_OCTSTR) +
|
||||||
Result:=data;
|
ASNObject(data, Self.FPDUType);
|
||||||
|
data := ASNObject(data, ASN1_SEQ);
|
||||||
|
Result := data;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.Clear}
|
|
||||||
procedure TSNMPRec.Clear;
|
procedure TSNMPRec.Clear;
|
||||||
var
|
var
|
||||||
i:integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
version:=0;
|
FVersion := 0;
|
||||||
community:='';
|
FCommunity := '';
|
||||||
PDUType:=0;
|
FPDUType := 0;
|
||||||
ErrorStatus:=0;
|
FErrorStatus := 0;
|
||||||
ErrorIndex:=0;
|
FErrorIndex := 0;
|
||||||
for i := 0 to SNMPMibList.count - 1 do
|
for i := 0 to FSNMPMibList.Count - 1 do
|
||||||
TSNMPMib(SNMPMibList[i]).Free;
|
TSNMPMib(FSNMPMibList[i]).Free;
|
||||||
SNMPMibList.Clear;
|
FSNMPMibList.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.MIBAdd}
|
procedure TSNMPRec.MIBAdd(const MIB, Value: string; ValueType: Integer);
|
||||||
procedure TSNMPRec.MIBAdd(MIB,Value:string; ValueType:integer);
|
|
||||||
var
|
var
|
||||||
SNMPMib: TSNMPMib;
|
SNMPMib: TSNMPMib;
|
||||||
begin
|
begin
|
||||||
@ -227,122 +239,117 @@ begin
|
|||||||
SNMPMib.OID := MIB;
|
SNMPMib.OID := MIB;
|
||||||
SNMPMib.Value := Value;
|
SNMPMib.Value := Value;
|
||||||
SNMPMib.ValueType := ValueType;
|
SNMPMib.ValueType := ValueType;
|
||||||
SNMPMibList.Add(SNMPMib);
|
FSNMPMibList.Add(SNMPMib);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.MIBdelete}
|
procedure TSNMPRec.MIBDelete(Index: Integer);
|
||||||
procedure TSNMPRec.MIBdelete(Index:integer);
|
|
||||||
begin
|
begin
|
||||||
if (Index >= 0) and (Index < SNMPMibList.count) then
|
if (Index >= 0) and (Index < FSNMPMibList.Count) then
|
||||||
begin
|
begin
|
||||||
TSNMPMib(SNMPMibList[Index]).Free;
|
TSNMPMib(FSNMPMibList[Index]).Free;
|
||||||
SNMPMibList.Delete(Index);
|
FSNMPMibList.Delete(Index);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPRec.MIBGet}
|
function TSNMPRec.MIBGet(const MIB: string): string;
|
||||||
function TSNMPRec.MIBGet(MIB:string):string;
|
|
||||||
var
|
var
|
||||||
i: integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
Result := '';
|
Result := '';
|
||||||
for i := 0 to SNMPMibList.count - 1 do
|
for i := 0 to FSNMPMibList.Count - 1 do
|
||||||
|
begin
|
||||||
|
if ((TSNMPMib(FSNMPMibList[i])).OID = MIB) then
|
||||||
begin
|
begin
|
||||||
if ((TSNMPMib(SNMPMibList[i])).OID = MIB) then
|
Result := (TSNMPMib(FSNMPMibList[i])).Value;
|
||||||
begin
|
Break;
|
||||||
Result := (TSNMPMib(SNMPMibList[i])).Value;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{TSNMPSend.Create}
|
|
||||||
constructor TSNMPSend.Create;
|
constructor TSNMPSend.Create;
|
||||||
begin
|
begin
|
||||||
inherited create;
|
inherited Create;
|
||||||
Query:=TSNMPRec.Create;
|
FQuery := TSNMPRec.Create;
|
||||||
Reply:=TSNMPRec.Create;
|
FReply := TSNMPRec.Create;
|
||||||
Query.Clear;
|
FQuery.Clear;
|
||||||
Reply.Clear;
|
FReply.Clear;
|
||||||
sock:=TUDPBlockSocket.create;
|
FSock := TUDPBlockSocket.Create;
|
||||||
sock.createsocket;
|
FSock.CreateSocket;
|
||||||
timeout:=5000;
|
FTimeout := 5000;
|
||||||
host:='localhost';
|
FHost := cLocalhost;
|
||||||
HostIP:='';
|
FHostIP := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPSend.Destroy}
|
|
||||||
destructor TSNMPSend.Destroy;
|
destructor TSNMPSend.Destroy;
|
||||||
begin
|
begin
|
||||||
Sock.Free;
|
FSock.Free;
|
||||||
Reply.Free;
|
FReply.Free;
|
||||||
Query.Free;
|
FQuery.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNMPSend.DoIt}
|
function TSNMPSend.DoIt: Boolean;
|
||||||
function TSNMPSend.DoIt:boolean;
|
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result := False;
|
||||||
reply.clear;
|
FReply.Clear;
|
||||||
Buffer:=Query.Encodebuf;
|
FBuffer := Query.EncodeBuf;
|
||||||
sock.connect(host,'161');
|
FSock.Connect(FHost, cSnmpProtocol);
|
||||||
HostIP:=sock.GetRemoteSinIP;
|
FHostIP := FSock.GetRemoteSinIP;
|
||||||
sock.SendBuffer(PChar(Buffer),Length(Buffer));
|
FSock.SendBuffer(PChar(FBuffer), Length(FBuffer));
|
||||||
if sock.canread(timeout)
|
if FSock.CanRead(FTimeout) then
|
||||||
then begin
|
begin
|
||||||
x:=sock.WaitingData;
|
x := FSock.WaitingData;
|
||||||
if x>0 then
|
if x > 0 then
|
||||||
begin
|
begin
|
||||||
setlength(Buffer,x);
|
SetLength(FBuffer, x);
|
||||||
sock.RecvBuffer(PChar(Buffer),x);
|
FSock.RecvBuffer(PChar(FBuffer), x);
|
||||||
result:=true;
|
Result := True;
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
if Result
|
end;
|
||||||
then result:=reply.DecodeBuf(Buffer);
|
if Result then
|
||||||
|
Result := FReply.DecodeBuf(FBuffer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
function SNMPget (Oid, Community, SNMPHost:string; var Value:string):Boolean;
|
function SNMPGet(const Oid, Community, SNMPHost: string;
|
||||||
|
var Value: string): Boolean;
|
||||||
var
|
var
|
||||||
SNMP:TSNMPSend;
|
SNMP: TSNMPSend;
|
||||||
begin
|
begin
|
||||||
SNMP:=TSNMPSend.Create;
|
SNMP := TSNMPSend.Create;
|
||||||
try
|
try
|
||||||
Snmp.Query.community:=Community;
|
SNMP.Query.Community := Community;
|
||||||
Snmp.Query.PDUType:=PDUGetRequest;
|
SNMP.Query.PDUType := PDUGetRequest;
|
||||||
Snmp.Query.MIBAdd(Oid,'',ASN1_NULL);
|
SNMP.Query.MIBAdd(Oid, '', ASN1_NULL);
|
||||||
Snmp.host:=SNMPHost;
|
SNMP.Host := SNMPHost;
|
||||||
Result:=Snmp.DoIt;
|
Result := SNMP.DoIt;
|
||||||
if Result then
|
if Result then
|
||||||
Value:=Snmp.Reply.MIBGet(Oid);
|
Value := SNMP.Reply.MIBGet(Oid);
|
||||||
finally
|
finally
|
||||||
SNMP.Free;
|
SNMP.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SNMPSet(Oid, Community, SNMPHost, Value: string; ValueType: integer): boolean;
|
function SNMPSet(const Oid, Community, SNMPHost, Value: string;
|
||||||
|
ValueType: Integer): Boolean;
|
||||||
var
|
var
|
||||||
SNMPSend: TSNMPSend;
|
SNMPSend: TSNMPSend;
|
||||||
begin
|
begin
|
||||||
SNMPSend := TSNMPSend.Create;
|
SNMPSend := TSNMPSend.Create;
|
||||||
try
|
try
|
||||||
SNMPSend.Query.community := Community;
|
SNMPSend.Query.Community := Community;
|
||||||
SNMPSend.Query.PDUType := PDUSetRequest;
|
SNMPSend.Query.PDUType := PDUSetRequest;
|
||||||
SNMPSend.Query.MIBAdd(Oid, Value, ValueType);
|
SNMPSend.Query.MIBAdd(Oid, Value, ValueType);
|
||||||
SNMPSend.Host := SNMPHost;
|
SNMPSend.Host := SNMPHost;
|
||||||
result:= SNMPSend.DoIt=true;
|
Result := SNMPSend.DoIt = True;
|
||||||
finally
|
finally
|
||||||
SNMPSend.Free;
|
SNMPSend.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
421
snmptrap.pas
421
snmptrap.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.002.001 |
|
| Project : Delphree - Synapse | 002.002.002 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: SNMP traps |
|
| Content: SNMP traps |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -25,105 +25,123 @@
|
|||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
{$Q-}
|
{$Q-}
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit SNMPTrap;
|
unit SNMPTrap;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, BlckSock, SynaUtil, ASN1Util, SNMPsend;
|
Classes, SysUtils,
|
||||||
|
blckSock, SynaUtil, ASN1Util, SNMPSend;
|
||||||
|
|
||||||
const
|
const
|
||||||
TRAP_PORT = 162;
|
cSnmpTrapProtocol = '162';
|
||||||
|
|
||||||
SNMP_VERSION = 0;
|
SNMP_VERSION = 0;
|
||||||
|
|
||||||
PDU_GET = $A0;
|
PDU_GET = $A0;
|
||||||
PDU_GETN = $A1;
|
PDU_GETN = $A1;
|
||||||
PDU_RESP = $A2;
|
PDU_RESP = $A2;
|
||||||
PDU_SET = $A3;
|
PDU_SET = $A3;
|
||||||
PDU_TRAP = $A4;
|
PDU_TRAP = $A4;
|
||||||
|
|
||||||
type
|
type
|
||||||
TTrapPDU = class(TObject)
|
TTrapPDU = class(TObject)
|
||||||
private
|
private
|
||||||
protected
|
FBuffer: string;
|
||||||
Buffer: string;
|
FTrapPort: string;
|
||||||
public
|
FVersion: Integer;
|
||||||
TrapPort: integer;
|
FPDUType: Integer;
|
||||||
Version: integer;
|
FCommunity: string;
|
||||||
PDUType: integer;
|
FEnterprise: string;
|
||||||
Community: string;
|
FTrapHost: string;
|
||||||
Enterprise: string;
|
FGenTrap: Integer;
|
||||||
TrapHost: string;
|
FSpecTrap: Integer;
|
||||||
GenTrap: integer;
|
FTimeTicks: Integer;
|
||||||
SpecTrap: integer;
|
FSNMPMibList: TList;
|
||||||
TimeTicks: integer;
|
public
|
||||||
SNMPMibList: TList;
|
constructor Create;
|
||||||
constructor Create;
|
destructor Destroy; override;
|
||||||
destructor Destroy; override;
|
procedure Clear;
|
||||||
procedure Clear;
|
procedure MIBAdd(const MIB, Value: string; ValueType: Integer);
|
||||||
procedure MIBAdd(MIB, Value: string; ValueType:integer);
|
procedure MIBDelete(Index: Integer);
|
||||||
procedure MIBDelete(Index: integer);
|
function MIBGet(const MIB: string): string;
|
||||||
function MIBGet(MIB: string): string;
|
function EncodeTrap: Integer;
|
||||||
function EncodeTrap: integer;
|
function DecodeTrap: Boolean;
|
||||||
function DecodeTrap: boolean;
|
published
|
||||||
|
property Version: Integer read FVersion Write FVersion;
|
||||||
|
property Community: string read FCommunity Write FCommunity;
|
||||||
|
property PDUType: Integer read FPDUType Write FPDUType;
|
||||||
|
property TrapPort: string read FTrapPort Write FTrapPort;
|
||||||
|
property Enterprise: string read FEnterprise Write FEnterprise;
|
||||||
|
property TrapHost: string read FTrapHost Write FTrapHost;
|
||||||
|
property GenTrap: Integer read FGenTrap Write FGenTrap;
|
||||||
|
property SpecTrap: Integer read FSpecTrap Write FSpecTrap;
|
||||||
|
property TimeTicks: Integer read FTimeTicks Write FTimeTicks;
|
||||||
|
property SNMPMibList: TList read FSNMPMibList;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TTrapSNMP = class(TObject)
|
TTrapSNMP = class(TObject)
|
||||||
private
|
private
|
||||||
sock: TUDPBlockSocket;
|
FSock: TUDPBlockSocket;
|
||||||
|
FTrap: TTrapPDU;
|
||||||
|
FSNMPHost: string;
|
||||||
|
FTimeout: Integer;
|
||||||
public
|
public
|
||||||
Trap: TTrapPDU;
|
|
||||||
SNMPHost: string;
|
|
||||||
Timeout: integer;
|
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function Send: integer;
|
function Send: Integer;
|
||||||
function Recv: integer;
|
function Recv: Integer;
|
||||||
|
published
|
||||||
|
property Trap: TTrapPDU read FTrap;
|
||||||
|
property SNMPHost: string read FSNMPHost Write FSNMPHost;
|
||||||
|
property Timeout: Integer read FTimeout Write FTimeout;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SendTrap(Dest, Source, Enterprise, Community: string;
|
function SendTrap(const Dest, Source, Enterprise, Community: string;
|
||||||
Generic, Specific, Seconds: integer; MIBName, MIBValue: string; MIBtype:integer): integer;
|
Generic, Specific, Seconds: Integer; const MIBName, MIBValue: string;
|
||||||
|
MIBtype: Integer): Integer;
|
||||||
function RecvTrap(var Dest, Source, Enterprise, Community: string;
|
function RecvTrap(var Dest, Source, Enterprise, Community: string;
|
||||||
var Generic, Specific, Seconds: integer; var MIBName, MIBValue: TStringList): integer;
|
var Generic, Specific, Seconds: Integer; const MIBName,
|
||||||
|
MIBValue: TStringList): Integer;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
constructor TTrapPDU.Create;
|
constructor TTrapPDU.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
SNMPMibList := TList.create;
|
FSNMPMibList := TList.Create;
|
||||||
TrapPort := TRAP_PORT;
|
FTrapPort := cSnmpTrapProtocol;
|
||||||
Version := SNMP_VERSION;
|
FVersion := SNMP_VERSION;
|
||||||
PDUType := PDU_TRAP;
|
FPDUType := PDU_TRAP;
|
||||||
Community := 'public';
|
FCommunity := 'public';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TTrapPDU.Destroy;
|
destructor TTrapPDU.Destroy;
|
||||||
var
|
var
|
||||||
i:integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to SNMPMibList.count - 1 do
|
for i := 0 to FSNMPMibList.Count - 1 do
|
||||||
TSNMPMib(SNMPMibList[i]).Free;
|
TSNMPMib(FSNMPMibList[i]).Free;
|
||||||
SNMPMibList.free;
|
FSNMPMibList.Free;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTrapPDU.Clear;
|
procedure TTrapPDU.Clear;
|
||||||
var
|
var
|
||||||
i:integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to SNMPMibList.count - 1 do
|
for i := 0 to FSNMPMibList.Count - 1 do
|
||||||
TSNMPMib(SNMPMibList[i]).Free;
|
TSNMPMib(FSNMPMibList[i]).Free;
|
||||||
SNMPMibList.Clear;
|
FSNMPMibList.Clear;
|
||||||
TrapPort := TRAP_PORT;
|
FTrapPort := cSnmpTrapProtocol;
|
||||||
Version := SNMP_VERSION;
|
FVersion := SNMP_VERSION;
|
||||||
PDUType := PDU_TRAP;
|
FPDUType := PDU_TRAP;
|
||||||
Community := 'public';
|
FCommunity := 'public';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTrapPDU.MIBAdd(MIB, Value: string; ValueType:integer);
|
procedure TTrapPDU.MIBAdd(const MIB, Value: string; ValueType: Integer);
|
||||||
var
|
var
|
||||||
SNMPMib: TSNMPMib;
|
SNMPMib: TSNMPMib;
|
||||||
begin
|
begin
|
||||||
@ -131,216 +149,207 @@ begin
|
|||||||
SNMPMib.OID := MIB;
|
SNMPMib.OID := MIB;
|
||||||
SNMPMib.Value := Value;
|
SNMPMib.Value := Value;
|
||||||
SNMPMib.ValueType := ValueType;
|
SNMPMib.ValueType := ValueType;
|
||||||
SNMPMibList.Add(SNMPMib);
|
FSNMPMibList.Add(SNMPMib);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTrapPDU.MIBDelete(Index: integer);
|
procedure TTrapPDU.MIBDelete(Index: Integer);
|
||||||
begin
|
begin
|
||||||
if (Index >= 0) and (Index < SNMPMibList.count) then
|
if (Index >= 0) and (Index < FSNMPMibList.Count) then
|
||||||
begin
|
begin
|
||||||
TSNMPMib(SNMPMibList[Index]).Free;
|
TSNMPMib(FSNMPMibList[Index]).Free;
|
||||||
SNMPMibList.Delete(Index);
|
FSNMPMibList.Delete(Index);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTrapPDU.MIBGet(MIB: string): string;
|
function TTrapPDU.MIBGet(const MIB: string): string;
|
||||||
var
|
var
|
||||||
i: integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
Result := '';
|
Result := '';
|
||||||
for i := 0 to SNMPMibList.count - 1 do
|
for i := 0 to FSNMPMibList.Count - 1 do
|
||||||
|
begin
|
||||||
|
if TSNMPMib(FSNMPMibList[i]).OID = MIB then
|
||||||
begin
|
begin
|
||||||
if ((TSNMPMib(SNMPMibList[i])).OID = MIB) then
|
Result := TSNMPMib(FSNMPMibList[i]).Value;
|
||||||
begin
|
Break;
|
||||||
Result := (TSNMPMib(SNMPMibList[i])).Value;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTrapPDU.EncodeTrap: integer;
|
function TTrapPDU.EncodeTrap: Integer;
|
||||||
var
|
var
|
||||||
s: string;
|
s: string;
|
||||||
n: integer;
|
n: Integer;
|
||||||
SNMPMib: TSNMPMib;
|
SNMPMib: TSNMPMib;
|
||||||
begin
|
begin
|
||||||
Buffer := '';
|
FBuffer := '';
|
||||||
for n:=0 to SNMPMibList.Count-1 do
|
for n := 0 to FSNMPMibList.Count - 1 do
|
||||||
begin
|
begin
|
||||||
SNMPMib := SNMPMibList[n];
|
SNMPMib := FSNMPMibList[n];
|
||||||
case (SNMPMib.ValueType) of
|
case SNMPMib.ValueType of
|
||||||
ASN1_INT:
|
ASN1_INT:
|
||||||
begin
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID)
|
ASNObject(ASNEncInt(StrToIntDef(SNMPMib.Value, 0)), SNMPMib.ValueType);
|
||||||
+ASNObject(ASNEncInt(strToIntDef(SNMPMib.Value,0)),SNMPMib.ValueType);
|
ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS:
|
||||||
end;
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS:
|
ASNObject(ASNEncUInt(StrToIntDef(SNMPMib.Value, 0)), SNMPMib.ValueType);
|
||||||
begin
|
ASN1_OBJID:
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID)
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
+ASNObject(ASNEncUInt(strToIntDef(SNMPMib.Value,0)),SNMPMib.ValueType);
|
ASNObject(MibToID(SNMPMib.Value), SNMPMib.ValueType);
|
||||||
end;
|
ASN1_IPADDR:
|
||||||
ASN1_OBJID:
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
begin
|
ASNObject(IPToID(SNMPMib.Value), SNMPMib.ValueType);
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject(MibToID(SNMPMib.Value),SNMPMib.ValueType);
|
ASN1_NULL:
|
||||||
end;
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
ASN1_IPADDR:
|
ASNObject('', ASN1_NULL);
|
||||||
begin
|
else
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject(IPToID(SNMPMib.Value),SNMPMib.ValueType);
|
s := ASNObject(MibToID(SNMPMib.OID), ASN1_OBJID) +
|
||||||
end;
|
ASNObject(SNMPMib.Value, SNMPMib.ValueType);
|
||||||
ASN1_NULL:
|
|
||||||
begin
|
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject('',ASN1_NULL);
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
s := ASNObject(MibToID(SNMPMib.OID),ASN1_OBJID) + ASNObject(SNMPMib.Value,SNMPMib.ValueType);
|
|
||||||
end;
|
|
||||||
Buffer := Buffer + ASNObject(s, ASN1_SEQ);
|
|
||||||
end;
|
end;
|
||||||
Buffer := ASNObject(Buffer, ASN1_SEQ);
|
FBuffer := FBuffer + ASNObject(s, ASN1_SEQ);
|
||||||
Buffer := ASNObject(ASNEncInt(GenTrap), ASN1_INT)
|
end;
|
||||||
+ ASNObject(ASNEncInt(SpecTrap), ASN1_INT)
|
FBuffer := ASNObject(FBuffer, ASN1_SEQ);
|
||||||
+ ASNObject(ASNEncUInt(TimeTicks), ASN1_TIMETICKS)
|
FBuffer := ASNObject(ASNEncInt(FGenTrap), ASN1_INT) +
|
||||||
+ Buffer;
|
ASNObject(ASNEncInt(FSpecTrap), ASN1_INT) +
|
||||||
Buffer := ASNObject(MibToID(Enterprise), ASN1_OBJID)
|
ASNObject(ASNEncUInt(FTimeTicks), ASN1_TIMETICKS) +
|
||||||
+ ASNObject(IPToID(TrapHost), ASN1_IPADDR)
|
FBuffer;
|
||||||
+ Buffer;
|
FBuffer := ASNObject(MibToID(FEnterprise), ASN1_OBJID) +
|
||||||
Buffer := ASNObject(ASNEncInt(Version), ASN1_INT)
|
ASNObject(IPToID(FTrapHost), ASN1_IPADDR) +
|
||||||
+ ASNObject(Community, ASN1_OCTSTR)
|
FBuffer;
|
||||||
+ ASNObject(Buffer, Self.PDUType);
|
FBuffer := ASNObject(ASNEncInt(FVersion), ASN1_INT) +
|
||||||
Buffer := ASNObject(Buffer, ASN1_SEQ);
|
ASNObject(FCommunity, ASN1_OCTSTR) +
|
||||||
|
ASNObject(FBuffer, Self.FPDUType);
|
||||||
|
FBuffer := ASNObject(FBuffer, ASN1_SEQ);
|
||||||
Result := 1;
|
Result := 1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTrapPDU.DecodeTrap: boolean;
|
function TTrapPDU.DecodeTrap: Boolean;
|
||||||
var
|
var
|
||||||
Pos, EndPos: integer;
|
Pos, EndPos: Integer;
|
||||||
Sm, Sv: string;
|
Sm, Sv: string;
|
||||||
Svt:integer;
|
Svt: Integer;
|
||||||
begin
|
begin
|
||||||
clear;
|
Clear;
|
||||||
result:=false;
|
Result := False;
|
||||||
if length(buffer)<2
|
if Length(FBuffer) < 2 then
|
||||||
then exit;
|
Exit;
|
||||||
if (ord(buffer[1]) and $20)=0
|
if (Ord(FBuffer[1]) and $20) = 0 then
|
||||||
then exit;
|
Exit;
|
||||||
Pos := 2;
|
Pos := 2;
|
||||||
EndPos := ASNDecLen(Pos, Buffer);
|
EndPos := ASNDecLen(Pos, FBuffer);
|
||||||
Version := StrToIntDef(ASNItem(Pos, Buffer,svt), 0);
|
FVersion := StrToIntDef(ASNItem(Pos, FBuffer, Svt), 0);
|
||||||
Community := ASNItem(Pos, Buffer,svt);
|
FCommunity := ASNItem(Pos, FBuffer, Svt);
|
||||||
PDUType := StrToIntDef(ASNItem(Pos, Buffer,svt), PDU_TRAP);
|
FPDUType := StrToIntDef(ASNItem(Pos, FBuffer, Svt), PDU_TRAP);
|
||||||
Enterprise := ASNItem(Pos, Buffer,svt);
|
FEnterprise := ASNItem(Pos, FBuffer, Svt);
|
||||||
TrapHost := ASNItem(Pos, Buffer,svt);
|
FTrapHost := ASNItem(Pos, FBuffer, Svt);
|
||||||
GenTrap := StrToIntDef(ASNItem(Pos, Buffer,svt), 0);
|
FGenTrap := StrToIntDef(ASNItem(Pos, FBuffer, Svt), 0);
|
||||||
Spectrap := StrToIntDef(ASNItem(Pos, Buffer,svt), 0);
|
FSpecTrap := StrToIntDef(ASNItem(Pos, FBuffer, Svt), 0);
|
||||||
TimeTicks := StrToIntDef(ASNItem(Pos, Buffer,svt), 0);
|
FTimeTicks := StrToIntDef(ASNItem(Pos, FBuffer, Svt), 0);
|
||||||
ASNItem(Pos, Buffer,svt);
|
ASNItem(Pos, FBuffer, Svt);
|
||||||
while (Pos < EndPos) do
|
while Pos < EndPos do
|
||||||
begin
|
begin
|
||||||
ASNItem(Pos, Buffer,svt);
|
ASNItem(Pos, FBuffer, Svt);
|
||||||
Sm := ASNItem(Pos, Buffer,svt);
|
Sm := ASNItem(Pos, FBuffer, Svt);
|
||||||
Sv := ASNItem(Pos, Buffer,svt);
|
Sv := ASNItem(Pos, FBuffer, Svt);
|
||||||
MIBAdd(Sm, Sv, svt);
|
MIBAdd(Sm, Sv, Svt);
|
||||||
end;
|
end;
|
||||||
Result := true;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TTrapSNMP.Create;
|
constructor TTrapSNMP.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
Sock := TUDPBlockSocket.Create;
|
FSock := TUDPBlockSocket.Create;
|
||||||
Trap := TTrapPDU.Create;
|
FTrap := TTrapPDU.Create;
|
||||||
Timeout := 5000;
|
FTimeout := 5000;
|
||||||
SNMPHost := '127.0.0.1';
|
FSNMPHost := cLocalhost;
|
||||||
Sock.CreateSocket;
|
FSock.CreateSocket;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TTrapSNMP.Destroy;
|
destructor TTrapSNMP.Destroy;
|
||||||
begin
|
begin
|
||||||
Trap.Free;
|
FTrap.Free;
|
||||||
Sock.Free;
|
FSock.Free;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTrapSNMP.Send: integer;
|
function TTrapSNMP.Send: Integer;
|
||||||
begin
|
begin
|
||||||
Trap.EncodeTrap;
|
FTrap.EncodeTrap;
|
||||||
Sock.Connect(SNMPHost, IntToStr(Trap.TrapPort));
|
FSock.Connect(SNMPHost, FTrap.TrapPort);
|
||||||
Sock.SendBuffer(PChar(Trap.Buffer), Length(Trap.Buffer));
|
FSock.SendBuffer(PChar(FTrap.FBuffer), Length(FTrap.FBuffer));
|
||||||
Result := 1;
|
Result := 1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTrapSNMP.Recv: integer;
|
function TTrapSNMP.Recv: Integer;
|
||||||
var
|
var
|
||||||
x: integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
Result := 0;
|
Result := 0;
|
||||||
Sock.Bind('0.0.0.0', IntToStr(Trap.TrapPort));
|
FSock.Bind('0.0.0.0', FTrap.TrapPort);
|
||||||
if Sock.CanRead(Timeout) then
|
if FSock.CanRead(FTimeout) then
|
||||||
|
begin
|
||||||
|
x := FSock.WaitingData;
|
||||||
|
if x > 0 then
|
||||||
begin
|
begin
|
||||||
x := Sock.WaitingData;
|
SetLength(FTrap.FBuffer, x);
|
||||||
if (x > 0) then
|
FSock.RecvBuffer(PChar(FTrap.FBuffer), x);
|
||||||
begin
|
if FTrap.DecodeTrap then
|
||||||
SetLength(Trap.Buffer, x);
|
Result := 1;
|
||||||
Sock.RecvBuffer(PChar(Trap.Buffer), x);
|
|
||||||
if Trap.DecodeTrap
|
|
||||||
then Result:=1;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SendTrap(Dest, Source, Enterprise, Community: string;
|
function SendTrap(const Dest, Source, Enterprise, Community: string;
|
||||||
Generic, Specific, Seconds: integer; MIBName, MIBValue: string; MIBtype:integer): integer;
|
Generic, Specific, Seconds: Integer; const MIBName, MIBValue: string;
|
||||||
var
|
MIBtype: Integer): Integer;
|
||||||
SNMP: TTrapSNMP;
|
|
||||||
begin
|
begin
|
||||||
SNMP := TTrapSNMP.Create;
|
with TTrapSNMP.Create do
|
||||||
try
|
try
|
||||||
SNMP.SNMPHost := Dest;
|
SNMPHost := Dest;
|
||||||
SNMP.Trap.TrapHost := Source;
|
Trap.TrapHost := Source;
|
||||||
SNMP.Trap.Enterprise := Enterprise;
|
Trap.Enterprise := Enterprise;
|
||||||
SNMP.Trap.Community := Community;
|
Trap.Community := Community;
|
||||||
SNMP.Trap.GenTrap := Generic;
|
Trap.GenTrap := Generic;
|
||||||
SNMP.Trap.SpecTrap := Specific;
|
Trap.SpecTrap := Specific;
|
||||||
SNMP.Trap.TimeTicks := Seconds;
|
Trap.TimeTicks := Seconds;
|
||||||
SNMP.Trap.MIBAdd(MIBName,MIBValue,MIBType);
|
Trap.MIBAdd(MIBName, MIBValue, MIBType);
|
||||||
Result := SNMP.Send;
|
Result := Send;
|
||||||
finally
|
finally
|
||||||
SNMP.Free;
|
Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function RecvTrap(var Dest, Source, Enterprise, Community: string;
|
function RecvTrap(var Dest, Source, Enterprise, Community: string;
|
||||||
var Generic, Specific, Seconds: integer; var MIBName, MIBValue: TStringList):
|
var Generic, Specific, Seconds: Integer;
|
||||||
integer;
|
const MIBName, MIBValue: TStringList): Integer;
|
||||||
var
|
var
|
||||||
SNMP: TTrapSNMP;
|
i: Integer;
|
||||||
i: integer;
|
|
||||||
begin
|
begin
|
||||||
SNMP := TTrapSNMP.Create;
|
with TTrapSNMP.Create do
|
||||||
try
|
try
|
||||||
SNMP.SNMPHost := Dest;
|
SNMPHost := Dest;
|
||||||
Result := SNMP.Recv;
|
Result := Recv;
|
||||||
if (Result <> 0) then
|
if Result <> 0 then
|
||||||
begin
|
begin
|
||||||
Dest := SNMP.SNMPHost;
|
Dest := SNMPHost;
|
||||||
Source := SNMP.Trap.TrapHost;
|
Source := Trap.TrapHost;
|
||||||
Enterprise := SNMP.Trap.Enterprise;
|
Enterprise := Trap.Enterprise;
|
||||||
Community := SNMP.Trap.Community;
|
Community := Trap.Community;
|
||||||
Generic := SNMP.Trap.GenTrap;
|
Generic := Trap.GenTrap;
|
||||||
Specific := SNMP.Trap.SpecTrap;
|
Specific := Trap.SpecTrap;
|
||||||
Seconds := SNMP.Trap.TimeTicks;
|
Seconds := Trap.TimeTicks;
|
||||||
MIBName.Clear;
|
MIBName.Clear;
|
||||||
MIBValue.Clear;
|
MIBValue.Clear;
|
||||||
for i:=0 to (SNMP.Trap.SNMPMibList.count - 1) do
|
for i := 0 to Trap.SNMPMibList.Count - 1 do
|
||||||
begin
|
begin
|
||||||
MIBName.Add(TSNMPMib(SNMP.Trap.SNMPMibList[i]).OID);
|
MIBName.Add(TSNMPMib(Trap.SNMPMibList[i]).OID);
|
||||||
MIBValue.Add(TSNMPMib(SNMP.Trap.SNMPMibList[i]).Value);
|
MIBValue.Add(TSNMPMib(Trap.SNMPMibList[i]).Value);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
SNMP.Free;
|
Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
204
sntpsend.pas
204
sntpsend.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.000.000 |
|
| Project : Delphree - Synapse | 002.000.001 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: SNTP client |
|
| Content: SNTP client |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -14,7 +14,7 @@
|
|||||||
| The Original Code is Synapse Delphi Library. |
|
| The Original Code is Synapse Delphi Library. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
|
||||||
| Portions created by Lukas Gebauer are Copyright (c)2000. |
|
| Portions created by Lukas Gebauer are Copyright (c)2000,2001. |
|
||||||
| All Rights Reserved. |
|
| All Rights Reserved. |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Contributor(s): |
|
| Contributor(s): |
|
||||||
@ -24,142 +24,144 @@
|
|||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
{$Q-}
|
{$Q-}
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit SNTPsend;
|
unit SNTPsend;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
synsock, SysUtils, blcksock;
|
SysUtils,
|
||||||
|
synsock, blcksock;
|
||||||
|
|
||||||
|
const
|
||||||
|
cNtpProtocol = 'ntp';
|
||||||
|
|
||||||
type
|
type
|
||||||
|
PNtp = ^TNtp;
|
||||||
TNtp = packed record
|
TNtp = packed record
|
||||||
mode:Byte;
|
mode: Byte;
|
||||||
stratum:Byte;
|
stratum: Byte;
|
||||||
poll:Byte;
|
poll: Byte;
|
||||||
Precision:Byte;
|
Precision: Byte;
|
||||||
RootDelay : longint;
|
RootDelay: Longint;
|
||||||
RootDisperson : longint;
|
RootDisperson: Longint;
|
||||||
RefID : longint;
|
RefID: Longint;
|
||||||
Ref1, Ref2,
|
Ref1: Longint;
|
||||||
Org1, Org2,
|
Ref2: Longint;
|
||||||
Rcv1, Rcv2,
|
Org1: Longint;
|
||||||
Xmit1, Xmit2 : longint;
|
Org2: Longint;
|
||||||
|
Rcv1: Longint;
|
||||||
|
Rcv2: Longint;
|
||||||
|
Xmit1: Longint;
|
||||||
|
Xmit2: Longint;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TSNTPSend=class(TObject)
|
TSNTPSend = class(TObject)
|
||||||
private
|
private
|
||||||
Sock:TUDPBlockSocket;
|
FNTPReply: TNtp;
|
||||||
Buffer:string;
|
FNTPTime: TDateTime;
|
||||||
|
FSntpHost: string;
|
||||||
|
FTimeout: Integer;
|
||||||
|
FSock: TUDPBlockSocket;
|
||||||
|
FBuffer: string;
|
||||||
public
|
public
|
||||||
timeout:integer;
|
|
||||||
SntpHost:string;
|
|
||||||
NTPReply:TNtp;
|
|
||||||
NTPTime:TDateTime;
|
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function DecodeTs(nsec,nfrac:Longint):tdatetime;
|
function DecodeTs(Nsec, Nfrac: Longint): TDateTime;
|
||||||
function GetNTP:Boolean;
|
function GetNTP: Boolean;
|
||||||
function GetBroadcastNTP:Boolean;
|
function GetBroadcastNTP: Boolean;
|
||||||
end;
|
published
|
||||||
|
property NTPReply: TNtp read FNTPReply;
|
||||||
|
property NTPTime: TDateTime read FNTPTime;
|
||||||
|
property SntpHost: string read FSntpHost write FSntpHost;
|
||||||
|
property Timeout: Integer read FTimeout write FTimeout;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
constructor TSNTPSend.Create;
|
||||||
|
|
||||||
{TSNTPSend.Create}
|
|
||||||
Constructor TSNTPSend.Create;
|
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
sock:=TUDPBlockSocket.create;
|
FSock := TUDPBlockSocket.Create;
|
||||||
sock.CreateSocket;
|
FSock.CreateSocket;
|
||||||
timeout:=5000;
|
FTimeout := 5000;
|
||||||
sntphost:='localhost';
|
FSntpHost := cLocalhost;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNTPSend.Destroy}
|
destructor TSNTPSend.Destroy;
|
||||||
Destructor TSNTPSend.Destroy;
|
|
||||||
begin
|
begin
|
||||||
Sock.free;
|
FSock.Free;
|
||||||
inherited destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNTPSend.DecodeTs}
|
function TSNTPSend.DecodeTs(Nsec, Nfrac: Longint): TDateTime;
|
||||||
function TSNTPSend.DecodeTs(nsec,nfrac:Longint):tdatetime;
|
|
||||||
const
|
const
|
||||||
maxi = 4294967296.0;
|
maxi = 4294967296.0;
|
||||||
var
|
var
|
||||||
d, d1: double;
|
d, d1: Double;
|
||||||
begin
|
begin
|
||||||
nsec:=synsock.htonl(nsec);
|
Nsec := synsock.htonl(Nsec);
|
||||||
nfrac:=synsock.htonl(nfrac);
|
Nfrac := synsock.htonl(Nfrac);
|
||||||
d:=nsec;
|
d := Nsec;
|
||||||
if d<0
|
if d < 0 then
|
||||||
then d:=maxi+d-1;
|
d := maxi + d - 1;
|
||||||
d1 := nfrac;
|
d1 := Nfrac;
|
||||||
if d1<0
|
if d1 < 0 then
|
||||||
then d1:=maxi+d1-1;
|
d1 := maxi + d1 - 1;
|
||||||
d1:=d1/maxi;
|
d1 := d1 / maxi;
|
||||||
d1:=trunc(d1*1000)/1000;
|
d1 := Trunc(d1 * 1000) / 1000;
|
||||||
result:=(d+d1)/86400;
|
Result := (d + d1) / 86400;
|
||||||
result := Result + 2;
|
Result := Result + 2;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TSNTPSend.GetBroadcastNTP: Boolean;
|
||||||
{TSNTPSend.GetBroadcastNTP}
|
|
||||||
function TSNTPSend.GetBroadcastNTP:Boolean;
|
|
||||||
var
|
var
|
||||||
PNtp:^TNtp;
|
NtpPtr: PNtp;
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := False;
|
||||||
sock.bind('0.0.0.0','ntp');
|
FSock.Bind('0.0.0.0', cNtpProtocol);
|
||||||
if sock.canread(timeout)
|
if FSock.CanRead(Timeout) then
|
||||||
then begin
|
begin
|
||||||
x:=sock.waitingdata;
|
x := FSock.WaitingData;
|
||||||
setlength(Buffer,x);
|
SetLength(FBuffer, x);
|
||||||
sock.recvbufferFrom(Pointer(Buffer),x);
|
FSock.RecvBufferFrom(Pointer(FBuffer), x);
|
||||||
if (sntphost='0.0.0.0') or (sock.GetRemoteSinIP=sntphost) then
|
if (SntpHost = '0.0.0.0') or (FSock.GetRemoteSinIP = SntpHost) then
|
||||||
if x>=SizeOf(NTPReply) then
|
if x >= SizeOf(NTPReply) then
|
||||||
begin
|
begin
|
||||||
PNtp:=Pointer(Buffer);
|
NtpPtr := Pointer(FBuffer);
|
||||||
NtpReply:=PNtp^;
|
FNTPReply := NtpPtr^;
|
||||||
NTPtime:=DeCodeTs(ntpreply.Xmit1,ntpreply.Xmit2);
|
FNTPTime := DecodeTs(NTPReply.Xmit1, NTPReply.Xmit2);
|
||||||
Result:=True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{TSNTPSend.GetNTP}
|
function TSNTPSend.GetNTP: Boolean;
|
||||||
function TSNTPSend.GetNTP:Boolean;
|
|
||||||
var
|
var
|
||||||
q:Tntp;
|
q: TNtp;
|
||||||
PNtp:^TNtp;
|
NtpPtr: PNtp;
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result := False;
|
||||||
sock.Connect(sntphost,'ntp');
|
FSock.Connect(sntphost, cNtpProtocol);
|
||||||
fillchar(q,SizeOf(q),0);
|
FillChar(q, SizeOf(q), 0);
|
||||||
q.mode:=$1b;
|
q.mode := $1B;
|
||||||
sock.SendBuffer(@q,SizeOf(q));
|
FSock.SendBuffer(@q, SizeOf(q));
|
||||||
if sock.canread(timeout)
|
if FSock.CanRead(Timeout) then
|
||||||
then begin
|
begin
|
||||||
x:=sock.waitingdata;
|
x := FSock.WaitingData;
|
||||||
setlength(Buffer,x);
|
SetLength(FBuffer, x);
|
||||||
sock.recvbuffer(Pointer(Buffer),x);
|
FSock.RecvBuffer(Pointer(FBuffer), x);
|
||||||
if x>=SizeOf(NTPReply) then
|
if x >= SizeOf(NTPReply) then
|
||||||
begin
|
begin
|
||||||
PNtp:=Pointer(Buffer);
|
NtpPtr := Pointer(FBuffer);
|
||||||
NtpReply:=PNtp^;
|
FNTPReply := NtpPtr^;
|
||||||
NTPtime:=DeCodeTs(ntpreply.Xmit1,ntpreply.Xmit2);
|
FNTPTime := DecodeTs(NTPReply.Xmit1, NTPReply.Xmit2);
|
||||||
Result:=True;
|
Result := True;
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
1191
synachar.pas
Normal file
1191
synachar.pas
Normal file
File diff suppressed because it is too large
Load Diff
1031
synacode.pas
1031
synacode.pas
File diff suppressed because it is too large
Load Diff
21
synahook.pas
Normal file
21
synahook.pas
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
unit SynaHook;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
type
|
||||||
|
THookReason = (
|
||||||
|
HR_connect,
|
||||||
|
HR_login,
|
||||||
|
HR_logout,
|
||||||
|
HR_command,
|
||||||
|
HR_result,
|
||||||
|
HR_beginTransfer,
|
||||||
|
HR_endTransfer,
|
||||||
|
HR_TransferCounter
|
||||||
|
);
|
||||||
|
|
||||||
|
THookEvent = procedure(Sender: TObject; Reason: THookReason; Value: string) of object;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
end.
|
703
synautil.pas
703
synautil.pas
@ -1,11 +1,11 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 002.000.000 |
|
| Project : Delphree - Synapse | 002.000.001 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: support procedures and functions |
|
| Content: support procedures and functions |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a Copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
| Software distributed under the License is distributed on an "AS IS" basis, |
|
| Software distributed under the License is distributed on an "AS IS" basis, |
|
||||||
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
| WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
|
||||||
@ -32,428 +32,447 @@ unit SynaUtil;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
sysutils, classes,
|
SysUtils, Classes,
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
libc;
|
Libc;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
windows;
|
Windows;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
function timezone:string;
|
function Timezone: string;
|
||||||
function Rfc822DateTime(t:TDateTime):String;
|
function Rfc822DateTime(t: TDateTime): string;
|
||||||
function CodeInt(Value:word):string;
|
function CodeInt(Value: Word): string;
|
||||||
function DeCodeInt(Value:string;Index:integer):word;
|
function DecodeInt(const Value: string; Index: Integer): Word;
|
||||||
function IsIP(Value:string):Boolean;
|
function IsIP(const Value: string): Boolean;
|
||||||
function ReverseIP(Value:string):string;
|
function ReverseIP(Value: string): string;
|
||||||
procedure Dump (Buffer:string;DumpFile:string);
|
procedure Dump(const Buffer, DumpFile: string);
|
||||||
function SeparateLeft(value,delimiter:string):string;
|
function SeparateLeft(const Value, Delimiter: string): string;
|
||||||
function SeparateRight(value,delimiter:string):string;
|
function SeparateRight(const Value, Delimiter: string): string;
|
||||||
function getparameter(value,parameter:string):string;
|
function GetParameter(const Value, Parameter: string): string;
|
||||||
function GetEmailAddr(value:string):string;
|
function GetEmailAddr(const Value: string): string;
|
||||||
function GetEmailDesc(value:string):string;
|
function GetEmailDesc(Value: string): string;
|
||||||
function StrToHex(value:string):string;
|
function StrToHex(const Value: string): string;
|
||||||
function IntToBin(value:integer;digits:byte):string;
|
function IntToBin(Value: Integer; Digits: Byte): string;
|
||||||
function BinToInt(value:string):integer;
|
function BinToInt(const Value: string): Integer;
|
||||||
function ParseURL(URL:string; var Prot,User,Pass,Host,Port,Path,Para:string):string;
|
function ParseURL(URL: string; var Prot, User, Pass, Host, Port, Path,
|
||||||
function StringReplace(value,search,replace:string):string;
|
Para: string): string;
|
||||||
|
function StringReplace(Value, Search, Replace: string): string;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{timezone}
|
|
||||||
function timezone:string;
|
function Timezone: string;
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
var
|
var
|
||||||
t: TTime_T;
|
t: TTime_T;
|
||||||
UT: TUnixTime;
|
UT: TUnixTime;
|
||||||
bias:integer;
|
bias: Integer;
|
||||||
h,m:integer;
|
h, m: Integer;
|
||||||
begin
|
begin
|
||||||
__time(@T);
|
__time(@T);
|
||||||
localtime_r(@T,UT);
|
localtime_r(@T, UT);
|
||||||
bias:=ut.__tm_gmtoff div 60;
|
bias := ut.__tm_gmtoff div 60;
|
||||||
if bias>=0 then result:='+'
|
if bias >= 0 then
|
||||||
else result:='-';
|
Result := '+'
|
||||||
|
else
|
||||||
|
Result := '-';
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
var
|
var
|
||||||
zoneinfo:TTimeZoneInformation;
|
zoneinfo: TTimeZoneInformation;
|
||||||
bias:integer;
|
bias: Integer;
|
||||||
h,m:integer;
|
h, m: Integer;
|
||||||
begin
|
begin
|
||||||
case GetTimeZoneInformation(Zoneinfo) of
|
case GetTimeZoneInformation(Zoneinfo) of
|
||||||
2: bias:=zoneinfo.bias+zoneinfo.DaylightBias;
|
2:
|
||||||
1: bias:=zoneinfo.bias+zoneinfo.StandardBias;
|
bias := zoneinfo.Bias + zoneinfo.DaylightBias;
|
||||||
else
|
1:
|
||||||
bias:=zoneinfo.bias;
|
bias := zoneinfo.Bias + zoneinfo.StandardBias;
|
||||||
|
else
|
||||||
|
bias := zoneinfo.Bias;
|
||||||
end;
|
end;
|
||||||
if bias<=0 then result:='+'
|
if bias <= 0 then
|
||||||
else result:='-';
|
Result := '+'
|
||||||
|
else
|
||||||
|
Result := '-';
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
bias:=abs(bias);
|
bias := Abs(bias);
|
||||||
h:=bias div 60;
|
h := bias div 60;
|
||||||
m:=bias mod 60;
|
m := bias mod 60;
|
||||||
result:=result+format('%.2d%.2d',[h,m]);
|
Result := Result + Format('%.2d%.2d', [h, m]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{Rfc822DateTime}
|
function Rfc822DateTime(t: TDateTime): string;
|
||||||
function Rfc822DateTime(t:TDateTime):String;
|
|
||||||
var
|
var
|
||||||
I: Integer;
|
I: Integer;
|
||||||
SaveDayNames: array[1..7] of string;
|
SaveDayNames: array[1..7] of string;
|
||||||
SaveMonthNames: array[1..12] of string;
|
SaveMonthNames: array[1..12] of string;
|
||||||
const
|
const
|
||||||
MyDayNames: array[1..7] of string =
|
MyDayNames: array[1..7] of string =
|
||||||
('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
|
('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
|
||||||
MyMonthNames: array[1..12] of string =
|
MyMonthNames: array[1..12] of string =
|
||||||
('Jan', 'Feb', 'Mar', 'Apr',
|
('Jan', 'Feb', 'Mar', 'Apr',
|
||||||
'May', 'Jun', 'Jul', 'Aug',
|
'May', 'Jun', 'Jul', 'Aug',
|
||||||
'Sep', 'Oct', 'Nov', 'Dec');
|
'Sep', 'Oct', 'Nov', 'Dec');
|
||||||
begin
|
begin
|
||||||
if ShortDayNames[1] = MyDayNames[1]
|
if ShortDayNames[1] = MyDayNames[1] then
|
||||||
then Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t)
|
Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
for I := Low(ShortDayNames) to High(ShortDayNames) do
|
||||||
|
begin
|
||||||
|
SaveDayNames[I] := ShortDayNames[I];
|
||||||
|
ShortDayNames[I] := MyDayNames[I];
|
||||||
|
end;
|
||||||
|
for I := Low(ShortMonthNames) to High(ShortMonthNames) do
|
||||||
|
begin
|
||||||
|
SaveMonthNames[I] := ShortMonthNames[I];
|
||||||
|
ShortMonthNames[I] := MyMonthNames[I];
|
||||||
|
end;
|
||||||
|
Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t);
|
||||||
|
for I := Low(ShortDayNames) to High(ShortDayNames) do
|
||||||
|
ShortDayNames[I] := SaveDayNames[I];
|
||||||
|
for I := Low(ShortMonthNames) to High(ShortMonthNames) do
|
||||||
|
ShortMonthNames[I] := SaveMonthNames[I];
|
||||||
|
end;
|
||||||
|
Result := Result + ' ' + Timezone;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function CodeInt(Value: Word): string;
|
||||||
|
begin
|
||||||
|
Result := Chr(Hi(Value)) + Chr(Lo(Value))
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function DecodeInt(const Value: string; Index: Integer): Word;
|
||||||
|
var
|
||||||
|
x, y: Byte;
|
||||||
|
begin
|
||||||
|
if Length(Value) > Index then
|
||||||
|
x := Ord(Value[Index])
|
||||||
|
else
|
||||||
|
x := 0;
|
||||||
|
if Length(Value) > (Index + 1) then
|
||||||
|
y := Ord(Value[Index + 1])
|
||||||
|
else
|
||||||
|
y := 0;
|
||||||
|
Result := x * 256 + y;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function IsIP(const Value: string): Boolean;
|
||||||
|
var
|
||||||
|
n, x: Integer;
|
||||||
|
begin
|
||||||
|
Result := true;
|
||||||
|
x := 0;
|
||||||
|
for n := 1 to Length(Value) do
|
||||||
|
if not (Value[n] in ['0'..'9', '.']) then
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
Break;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
for I := Low(ShortDayNames) to High(ShortDayNames) do
|
if Value[n] = '.' then
|
||||||
begin
|
Inc(x);
|
||||||
SaveDayNames[I] := ShortDayNames[I];
|
end;
|
||||||
ShortDayNames[I] := MyDayNames[I];
|
if x <> 3 then
|
||||||
end;
|
Result := False;
|
||||||
for I := Low(ShortMonthNames) to High(ShortMonthNames) do
|
|
||||||
begin
|
|
||||||
SaveMonthNames[I] := ShortMonthNames[I];
|
|
||||||
ShortMonthNames[I] := MyMonthNames[I];
|
|
||||||
end;
|
|
||||||
Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t);
|
|
||||||
for I := Low(ShortDayNames) to High(ShortDayNames) do
|
|
||||||
ShortDayNames[I] := SaveDayNames[I];
|
|
||||||
for I := Low(ShortMonthNames) to High(ShortMonthNames) do
|
|
||||||
ShortMonthNames[I] := SaveMonthNames[I];
|
|
||||||
end;
|
|
||||||
Result:=Result+' '+Timezone;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{CodeInt}
|
function ReverseIP(Value: string): string;
|
||||||
function CodeInt(Value:word):string;
|
|
||||||
begin
|
|
||||||
Result := Chr(Hi(Value))+ Chr(Lo(Value))
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
|
|
||||||
{DeCodeInt}
|
|
||||||
function DeCodeInt(Value:string;Index:integer):word;
|
|
||||||
var
|
var
|
||||||
x,y:Byte;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
if Length(Value)>index then x:=Ord(Value[index])
|
Result := '';
|
||||||
else x:=0;
|
|
||||||
if Length(Value)>(Index+1) then y:=Ord(Value[Index+1])
|
|
||||||
else y:=0;
|
|
||||||
Result:=x*256+y;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
|
|
||||||
{IsIP}
|
|
||||||
function IsIP(Value:string):Boolean;
|
|
||||||
var
|
|
||||||
n,x:integer;
|
|
||||||
begin
|
|
||||||
Result:=true;
|
|
||||||
x:=0;
|
|
||||||
for n:=1 to Length(Value) do
|
|
||||||
if not (Value[n] in ['0'..'9','.'])
|
|
||||||
then begin
|
|
||||||
Result:=False;
|
|
||||||
break;
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
if Value[n]='.' then Inc(x);
|
|
||||||
end;
|
|
||||||
if x<>3 then Result:=False;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
|
|
||||||
{ReverseIP}
|
|
||||||
function ReverseIP(Value:string):string;
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
begin
|
|
||||||
Result:='';
|
|
||||||
repeat
|
repeat
|
||||||
x:=LastDelimiter('.',Value);
|
x := LastDelimiter('.', Value);
|
||||||
Result:=Result+'.'+Copy(Value,x+1,Length(Value)-x);
|
Result := Result + '.' + Copy(Value, x + 1, Length(Value) - x);
|
||||||
Delete(Value,x,Length(Value)-x+1);
|
Delete(Value, x, Length(Value) - x + 1);
|
||||||
until x<1;
|
until x < 1;
|
||||||
if Length(Result)>0 then
|
if Length(Result) > 0 then
|
||||||
if Result[1]='.' then
|
if Result[1] = '.' then
|
||||||
Delete(Result, 1, 1);
|
Delete(Result, 1, 1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
{dump}
|
procedure Dump(const Buffer, DumpFile: string);
|
||||||
procedure dump (Buffer:string;DumpFile:string);
|
|
||||||
var
|
var
|
||||||
n:integer;
|
n: Integer;
|
||||||
s:string;
|
s: string;
|
||||||
f:Text;
|
f: Text;
|
||||||
begin
|
begin
|
||||||
s:='';
|
s := '';
|
||||||
for n:=1 to Length(Buffer) do
|
for n := 1 to Length(Buffer) do
|
||||||
s:=s+' +#$'+IntToHex(Ord(Buffer[n]),2);
|
s := s + ' +#$' + IntToHex(Ord(Buffer[n]), 2);
|
||||||
Assignfile(f,DumpFile);
|
AssignFile(f, DumpFile);
|
||||||
if fileexists(DumpFile) then deletefile(PChar(DumpFile));
|
if FileExists(DumpFile) then
|
||||||
rewrite(f);
|
DeleteFile(PChar(DumpFile));
|
||||||
|
Rewrite(f);
|
||||||
try
|
try
|
||||||
writeln(f,s);
|
Writeln(f, s);
|
||||||
finally
|
finally
|
||||||
closefile(f);
|
CloseFile(f);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{SeparateLeft}
|
|
||||||
function SeparateLeft(value,delimiter:string):string;
|
function SeparateLeft(const Value, Delimiter: string): string;
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
x:=pos(delimiter,value);
|
x := Pos(Delimiter, Value);
|
||||||
if x<1
|
if x < 1 then
|
||||||
then result:=trim(value)
|
Result := Trim(Value)
|
||||||
else result:=trim(copy(value,1,x-1));
|
else
|
||||||
|
Result := Trim(Copy(Value, 1, x - 1));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{SeparateRight}
|
|
||||||
function SeparateRight(value,delimiter:string):string;
|
function SeparateRight(const Value, Delimiter: string): string;
|
||||||
var
|
var
|
||||||
x:integer;
|
x: Integer;
|
||||||
begin
|
begin
|
||||||
x:=pos(delimiter,value);
|
x := Pos(Delimiter, Value);
|
||||||
if x>0
|
if x > 0 then
|
||||||
then x:=x+length(delimiter)-1;
|
x := x + Length(Delimiter) - 1;
|
||||||
result:=trim(copy(value,x+1,length(value)-x));
|
Result := Trim(Copy(Value, x + 1, Length(Value) - x));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{GetParameter}
|
|
||||||
function getparameter(value,parameter:string):string;
|
function GetParameter(const Value, Parameter: string): string;
|
||||||
var
|
var
|
||||||
x,x1:integer;
|
x, x1: Integer;
|
||||||
s:string;
|
s: string;
|
||||||
begin
|
begin
|
||||||
x:=pos(uppercase(parameter),uppercase(value));
|
x := Pos(UpperCase(Parameter), UpperCase(Value));
|
||||||
result:='';
|
Result := '';
|
||||||
if x>0 then
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
s := Copy(Value, x + Length(Parameter), Length(Value)
|
||||||
|
- (x + Length(Parameter)) + 1);
|
||||||
|
s := Trim(s);
|
||||||
|
x1 := Length(s);
|
||||||
|
if Length(s) > 1 then
|
||||||
begin
|
begin
|
||||||
s:=copy(value,x+length(parameter),length(value)-(x+length(parameter))+1);
|
if s[1] = '"' then
|
||||||
s:=trim(s);
|
|
||||||
x1:=length(s);
|
|
||||||
if length(s)>1 then
|
|
||||||
begin
|
|
||||||
if s[1]='"'
|
|
||||||
then
|
|
||||||
begin
|
|
||||||
s:=copy(s,2,length(s)-1);
|
|
||||||
x:=pos('"',s);
|
|
||||||
if x>0 then x1:=x-1;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
x:=pos(' ',s);
|
|
||||||
if x>0 then x1:=x-1;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
result:=copy(s,1,x1);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{GetEmailAddr}
|
|
||||||
function GetEmailAddr(value:string):string;
|
|
||||||
var
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
s:=separateright(value,'<');
|
|
||||||
s:=separateleft(s,'>');
|
|
||||||
result:=trim(s);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{GetEmailDesc}
|
|
||||||
function GetEmailDesc(value:string):string;
|
|
||||||
var
|
|
||||||
s:string;
|
|
||||||
begin
|
|
||||||
value:=trim(value);
|
|
||||||
s:=separateright(value,'"');
|
|
||||||
if s<>value
|
|
||||||
then s:=separateleft(s,'"')
|
|
||||||
else
|
|
||||||
begin
|
begin
|
||||||
s:=separateright(value,'(');
|
s := Copy(s, 2, Length(s) - 1);
|
||||||
if s<>value
|
x := Pos('"', s);
|
||||||
then s:=separateleft(s,')')
|
if x > 0 then
|
||||||
else
|
x1 := x - 1;
|
||||||
begin
|
end
|
||||||
s:=separateleft(value,'<');
|
else
|
||||||
if s=value
|
begin
|
||||||
then s:='';
|
x := Pos(' ', s);
|
||||||
end;
|
if x > 0 then
|
||||||
|
x1 := x - 1;
|
||||||
end;
|
end;
|
||||||
result:=trim(s);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{StrToHex}
|
|
||||||
function StrToHex(value:string):string;
|
|
||||||
var
|
|
||||||
n:integer;
|
|
||||||
begin
|
|
||||||
result:='';
|
|
||||||
for n:=1 to length(value) do
|
|
||||||
Result:=Result+IntToHex(Byte(value[n]),2);
|
|
||||||
result:=lowercase(result);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{IntToBin}
|
|
||||||
function IntToBin(value:integer;digits:byte):string;
|
|
||||||
var
|
|
||||||
x,y,n:integer;
|
|
||||||
begin
|
|
||||||
result:='';
|
|
||||||
x:=value;
|
|
||||||
repeat
|
|
||||||
y:=x mod 2;
|
|
||||||
x:=x div 2;
|
|
||||||
if y>0
|
|
||||||
then result:='1'+result
|
|
||||||
else result:='0'+result;
|
|
||||||
until x=0;
|
|
||||||
x:=length(result);
|
|
||||||
for n:=x to digits-1 do
|
|
||||||
result:='0'+result;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{==============================================================================}
|
|
||||||
{BinToInt}
|
|
||||||
function BinToInt(value:string):integer;
|
|
||||||
var
|
|
||||||
x,n:integer;
|
|
||||||
begin
|
|
||||||
result:=0;
|
|
||||||
for n:=1 to length(value) do
|
|
||||||
begin
|
|
||||||
if value[n]='0'
|
|
||||||
then x:=0
|
|
||||||
else x:=1;
|
|
||||||
result:=result*2+x;
|
|
||||||
end;
|
end;
|
||||||
|
Result := Copy(s, 1, x1);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ParseURL}
|
|
||||||
function ParseURL(URL:string; var Prot,User,Pass,Host,Port,Path,Para:string):string;
|
|
||||||
var
|
|
||||||
x:integer;
|
|
||||||
sURL:string;
|
|
||||||
s:string;
|
|
||||||
s1,s2:string;
|
|
||||||
begin
|
|
||||||
prot:='http';
|
|
||||||
user:='';
|
|
||||||
pass:='';
|
|
||||||
port:='80';
|
|
||||||
para:='';
|
|
||||||
|
|
||||||
x:=pos('://',URL);
|
function GetEmailAddr(const Value: string): string;
|
||||||
if x>0 then
|
var
|
||||||
begin
|
s: string;
|
||||||
prot:=separateleft(URL,'://');
|
begin
|
||||||
sURL:=separateright(URL,'://');
|
s := SeparateRight(Value, '<');
|
||||||
end
|
s := SeparateLeft(s, '>');
|
||||||
else sURL:=URL;
|
Result := Trim(s);
|
||||||
x:=pos('@',sURL);
|
end;
|
||||||
if x>0 then
|
|
||||||
begin
|
{==============================================================================}
|
||||||
s:=separateleft(sURL,'@');
|
|
||||||
sURL:=separateright(sURL,'@');
|
function GetEmailDesc(Value: string): string;
|
||||||
x:=pos(':',s);
|
var
|
||||||
if x>0 then
|
s: string;
|
||||||
begin
|
begin
|
||||||
user:=separateleft(s,':');
|
Value := Trim(Value);
|
||||||
pass:=separateright(s,':');
|
s := SeparateRight(Value, '"');
|
||||||
end
|
if s <> Value then
|
||||||
else user:=s;
|
s := SeparateLeft(s, '"')
|
||||||
end;
|
else
|
||||||
x:=pos('/',sURL);
|
begin
|
||||||
if x>0 then
|
s := SeparateRight(Value, '(');
|
||||||
begin
|
if s <> Value then
|
||||||
s1:=separateleft(sURL,'/');
|
s := SeparateLeft(s, ')')
|
||||||
s2:=separateright(sURL,'/');
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
s1:=sURL;
|
s := SeparateLeft(Value, '<');
|
||||||
s2:='';
|
if s = Value then
|
||||||
|
s := '';
|
||||||
end;
|
end;
|
||||||
x:=pos(':',s1);
|
end;
|
||||||
if x>0 then
|
Result := Trim(s);
|
||||||
begin
|
|
||||||
host:=separateleft(s1,':');
|
|
||||||
port:=separateright(s1,':');
|
|
||||||
end
|
|
||||||
else host:=s1;
|
|
||||||
result:='/'+s2;
|
|
||||||
x:=pos('?',s2);
|
|
||||||
if x>0 then
|
|
||||||
begin
|
|
||||||
path:='/'+separateleft(s2,'?');
|
|
||||||
para:=separateright(s2,'?');
|
|
||||||
end
|
|
||||||
else path:='/'+s2;
|
|
||||||
if host=''
|
|
||||||
then host:='localhost';
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{StringReplace}
|
|
||||||
function StringReplace(value,search,replace:string):string;
|
function StrToHex(const Value: string): string;
|
||||||
var
|
var
|
||||||
x,l,ls,lr:integer;
|
n: Integer;
|
||||||
begin
|
begin
|
||||||
if (value='') or (Search='') then
|
Result := '';
|
||||||
begin
|
for n := 1 to Length(Value) do
|
||||||
result:=value;
|
Result := Result + IntToHex(Byte(Value[n]), 2);
|
||||||
Exit;
|
Result := LowerCase(Result);
|
||||||
end;
|
|
||||||
ls:=length(search);
|
|
||||||
lr:=length(replace);
|
|
||||||
result:='';
|
|
||||||
x:=pos(search,value);
|
|
||||||
while x>0 do
|
|
||||||
begin
|
|
||||||
l:=length(result);
|
|
||||||
setlength(result,l+x-1);
|
|
||||||
Move(pointer(value)^,Pointer(@result[l+1])^, x-1);
|
|
||||||
// result:=result+copy(value,1,x-1);
|
|
||||||
l:=length(result);
|
|
||||||
setlength(result,l+lr);
|
|
||||||
Move(pointer(replace)^,Pointer(@result[l+1])^, lr);
|
|
||||||
// result:=result+replace;
|
|
||||||
delete(value,1,x-1+ls);
|
|
||||||
x:=pos(search,value);
|
|
||||||
end;
|
|
||||||
result:=result+value;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
|
|
||||||
|
function IntToBin(Value: Integer; Digits: Byte): string;
|
||||||
|
var
|
||||||
|
x, y, n: Integer;
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
x := Value;
|
||||||
|
repeat
|
||||||
|
y := x mod 2;
|
||||||
|
x := x div 2;
|
||||||
|
if y > 0 then
|
||||||
|
Result := '1' + Result
|
||||||
|
else
|
||||||
|
Result := '0' + Result;
|
||||||
|
until x = 0;
|
||||||
|
x := Length(Result);
|
||||||
|
for n := x to Digits - 1 do
|
||||||
|
Result := '0' + Result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function BinToInt(const Value: string): Integer;
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
for n := 1 to Length(Value) do
|
||||||
|
begin
|
||||||
|
if Value[n] = '0' then
|
||||||
|
Result := Result * 2
|
||||||
|
else
|
||||||
|
if Value[n] = '1' then
|
||||||
|
Result := Result * 2 + 1
|
||||||
|
else
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function ParseURL(URL: string; var Prot, User, Pass, Host, Port, Path,
|
||||||
|
Para: string): string;
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
sURL: string;
|
||||||
|
s: string;
|
||||||
|
s1, s2: string;
|
||||||
|
begin
|
||||||
|
Prot := 'http';
|
||||||
|
User := '';
|
||||||
|
Pass := '';
|
||||||
|
Port := '80';
|
||||||
|
Para := '';
|
||||||
|
|
||||||
|
x := Pos('://', URL);
|
||||||
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
Prot := SeparateLeft(URL, '://');
|
||||||
|
sURL := SeparateRight(URL, '://');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
sURL := URL;
|
||||||
|
x := Pos('@', sURL);
|
||||||
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
s := SeparateLeft(sURL, '@');
|
||||||
|
sURL := SeparateRight(sURL, '@');
|
||||||
|
x := Pos(':', s);
|
||||||
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
User := SeparateLeft(s, ':');
|
||||||
|
Pass := SeparateRight(s, ':');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
User := s;
|
||||||
|
end;
|
||||||
|
x := Pos('/', sURL);
|
||||||
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
s1 := SeparateLeft(sURL, '/');
|
||||||
|
s2 := SeparateRight(sURL, '/');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
s1 := sURL;
|
||||||
|
s2 := '';
|
||||||
|
end;
|
||||||
|
x := Pos(':', s1);
|
||||||
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
Host := SeparateLeft(s1, ':');
|
||||||
|
Port := SeparateRight(s1, ':');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Host := s1;
|
||||||
|
Result := '/' + s2;
|
||||||
|
x := Pos('?', s2);
|
||||||
|
if x > 0 then
|
||||||
|
begin
|
||||||
|
Path := '/' + SeparateLeft(s2, '?');
|
||||||
|
Para := SeparateRight(s2, '?');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Path := '/' + s2;
|
||||||
|
if Host = '' then
|
||||||
|
Host := 'localhost';
|
||||||
|
end;
|
||||||
|
|
||||||
|
{==============================================================================}
|
||||||
|
|
||||||
|
function StringReplace(Value, Search, Replace: string): string;
|
||||||
|
var
|
||||||
|
x, l, ls, lr: Integer;
|
||||||
|
begin
|
||||||
|
if (Value = '') or (Search = '') then
|
||||||
|
begin
|
||||||
|
Result := Value;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
ls := Length(Search);
|
||||||
|
lr := Length(Replace);
|
||||||
|
Result := '';
|
||||||
|
x := Pos(Search, Value);
|
||||||
|
while x > 0 do
|
||||||
|
begin
|
||||||
|
l := Length(Result);
|
||||||
|
SetLength(Result, l + x - 1);
|
||||||
|
Move(Pointer(Value)^, Pointer(@Result[l + 1])^, x - 1);
|
||||||
|
// Result:=Result+Copy(Value,1,x-1);
|
||||||
|
l := Length(Result);
|
||||||
|
SetLength(Result, l + lr);
|
||||||
|
Move(Pointer(Replace)^, Pointer(@Result[l + 1])^, lr);
|
||||||
|
// Result:=Result+Replace;
|
||||||
|
Delete(Value, 1, x - 1 + ls);
|
||||||
|
x := Pos(Search, Value);
|
||||||
|
end;
|
||||||
|
Result := Result + Value;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
623
synsock.pas
623
synsock.pas
@ -1,9 +1,9 @@
|
|||||||
{==============================================================================|
|
{==============================================================================|
|
||||||
| Project : Delphree - Synapse | 001.000.001 |
|
| Project : Delphree - Synapse | 001.000.002 |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| Content: Socket Independent Platform |
|
| Content: Socket Independent Platform |
|
||||||
|==============================================================================|
|
|==============================================================================|
|
||||||
| The contents of this file are subject to the Mozilla Public License Ver. 1.0 |
|
| The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
|
||||||
| (the "License"); you may not use this file except in compliance with the |
|
| (the "License"); you may not use this file except in compliance with the |
|
||||||
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
| License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ |
|
||||||
| |
|
| |
|
||||||
@ -23,83 +23,86 @@
|
|||||||
| (Found at URL: http://www.ararat.cz/synapse/) |
|
| (Found at URL: http://www.ararat.cz/synapse/) |
|
||||||
|==============================================================================}
|
|==============================================================================}
|
||||||
|
|
||||||
|
{$WEAKPACKAGEUNIT ON}
|
||||||
|
|
||||||
unit synsock;
|
unit synsock;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
libc, kernelioctl;
|
Libc, KernelIoctl;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
winsock, windows;
|
Windows, WinSock;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
const
|
const
|
||||||
WSAEINTR = EINTR;
|
WSAEINTR = EINTR;
|
||||||
WSAEBADF = EBADF;
|
WSAEBADF = EBADF;
|
||||||
WSAEACCES = EACCES;
|
WSAEACCES = EACCES;
|
||||||
WSAEFAULT = EFAULT;
|
WSAEFAULT = EFAULT;
|
||||||
WSAEINVAL = EINVAL;
|
WSAEINVAL = EINVAL;
|
||||||
WSAEMFILE = EMFILE;
|
WSAEMFILE = EMFILE;
|
||||||
WSAEWOULDBLOCK = EWOULDBLOCK;
|
WSAEWOULDBLOCK = EWOULDBLOCK;
|
||||||
WSAEINPROGRESS = EINPROGRESS;
|
WSAEINPROGRESS = EINPROGRESS;
|
||||||
WSAEALREADY = EALREADY;
|
WSAEALREADY = EALREADY;
|
||||||
WSAENOTSOCK = ENOTSOCK;
|
WSAENOTSOCK = ENOTSOCK;
|
||||||
WSAEDESTADDRREQ = EDESTADDRREQ;
|
WSAEDESTADDRREQ = EDESTADDRREQ;
|
||||||
WSAEMSGSIZE = EMSGSIZE;
|
WSAEMSGSIZE = EMSGSIZE;
|
||||||
WSAEPROTOTYPE = EPROTOTYPE;
|
WSAEPROTOTYPE = EPROTOTYPE;
|
||||||
WSAENOPROTOOPT = ENOPROTOOPT;
|
WSAENOPROTOOPT = ENOPROTOOPT;
|
||||||
WSAEPROTONOSUPPORT = EPROTONOSUPPORT;
|
WSAEPROTONOSUPPORT = EPROTONOSUPPORT;
|
||||||
WSAESOCKTNOSUPPORT = ESOCKTNOSUPPORT;
|
WSAESOCKTNOSUPPORT = ESOCKTNOSUPPORT;
|
||||||
WSAEOPNOTSUPP = EOPNOTSUPP;
|
WSAEOPNOTSUPP = EOPNOTSUPP;
|
||||||
WSAEPFNOSUPPORT = EPFNOSUPPORT;
|
WSAEPFNOSUPPORT = EPFNOSUPPORT;
|
||||||
WSAEAFNOSUPPORT = EAFNOSUPPORT;
|
WSAEAFNOSUPPORT = EAFNOSUPPORT;
|
||||||
WSAEADDRINUSE = EADDRINUSE;
|
WSAEADDRINUSE = EADDRINUSE;
|
||||||
WSAEADDRNOTAVAIL = EADDRNOTAVAIL;
|
WSAEADDRNOTAVAIL = EADDRNOTAVAIL;
|
||||||
WSAENETDOWN = ENETDOWN;
|
WSAENETDOWN = ENETDOWN;
|
||||||
WSAENETUNREACH = ENETUNREACH;
|
WSAENETUNREACH = ENETUNREACH;
|
||||||
WSAENETRESET = ENETRESET;
|
WSAENETRESET = ENETRESET;
|
||||||
WSAECONNABORTED = ECONNABORTED;
|
WSAECONNABORTED = ECONNABORTED;
|
||||||
WSAECONNRESET = ECONNRESET;
|
WSAECONNRESET = ECONNRESET;
|
||||||
WSAENOBUFS = ENOBUFS;
|
WSAENOBUFS = ENOBUFS;
|
||||||
WSAEISCONN = EISCONN;
|
WSAEISCONN = EISCONN;
|
||||||
WSAENOTCONN = ENOTCONN;
|
WSAENOTCONN = ENOTCONN;
|
||||||
WSAESHUTDOWN = ESHUTDOWN;
|
WSAESHUTDOWN = ESHUTDOWN;
|
||||||
WSAETOOMANYREFS = ETOOMANYREFS;
|
WSAETOOMANYREFS = ETOOMANYREFS;
|
||||||
WSAETIMEDOUT = ETIMEDOUT;
|
WSAETIMEDOUT = ETIMEDOUT;
|
||||||
WSAECONNREFUSED = ECONNREFUSED;
|
WSAECONNREFUSED = ECONNREFUSED;
|
||||||
WSAELOOP = ELOOP;
|
WSAELOOP = ELOOP;
|
||||||
WSAENAMETOOLONG = ENAMETOOLONG;
|
WSAENAMETOOLONG = ENAMETOOLONG;
|
||||||
WSAEHOSTDOWN = EHOSTDOWN;
|
WSAEHOSTDOWN = EHOSTDOWN;
|
||||||
WSAEHOSTUNREACH = EHOSTUNREACH;
|
WSAEHOSTUNREACH = EHOSTUNREACH;
|
||||||
WSAENOTEMPTY = ENOTEMPTY;
|
WSAENOTEMPTY = ENOTEMPTY;
|
||||||
WSAEPROCLIM = -1;
|
WSAEPROCLIM = -1;
|
||||||
WSAEUSERS = EUSERS;
|
WSAEUSERS = EUSERS;
|
||||||
WSAEDQUOT = EDQUOT;
|
WSAEDQUOT = EDQUOT;
|
||||||
WSAESTALE = ESTALE;
|
WSAESTALE = ESTALE;
|
||||||
WSAEREMOTE = EREMOTE;
|
WSAEREMOTE = EREMOTE;
|
||||||
WSASYSNOTREADY = -2;
|
WSASYSNOTREADY = -2;
|
||||||
WSAVERNOTSUPPORTED = -3;
|
WSAVERNOTSUPPORTED = -3;
|
||||||
WSANOTINITIALISED = -4;
|
WSANOTINITIALISED = -4;
|
||||||
WSAEDISCON = -5;
|
WSAEDISCON = -5;
|
||||||
WSAHOST_NOT_FOUND = HOST_NOT_FOUND;
|
WSAHOST_NOT_FOUND = HOST_NOT_FOUND;
|
||||||
WSATRY_AGAIN = TRY_AGAIN;
|
WSATRY_AGAIN = TRY_AGAIN;
|
||||||
WSANO_RECOVERY = NO_RECOVERY;
|
WSANO_RECOVERY = NO_RECOVERY;
|
||||||
// WSANO_DATA = NO_DATA;
|
// WSANO_DATA = NO_DATA;
|
||||||
WSANO_DATA = -6;
|
WSANO_DATA = -6;
|
||||||
|
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
|
|
||||||
const
|
const
|
||||||
DLLStackName = 'wsock32.dll';
|
DLLStackName = 'wsock32.dll';
|
||||||
var
|
var
|
||||||
LibHandle : THandle = 0;
|
LibHandle: THandle = 0;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
const
|
const
|
||||||
WSADESCRIPTION_LEN = 256;
|
WSADESCRIPTION_LEN = 256;
|
||||||
WSASYS_STATUS_LEN = 128;
|
WSASYS_STATUS_LEN = 128;
|
||||||
type
|
type
|
||||||
PWSAData = ^TWSAData;
|
PWSAData = ^TWSAData;
|
||||||
TWSAData = packed record
|
TWSAData = packed record
|
||||||
@ -111,321 +114,328 @@ type
|
|||||||
iMaxUdpDg: Word;
|
iMaxUdpDg: Word;
|
||||||
lpVendorInfo: PChar;
|
lpVendorInfo: PChar;
|
||||||
end;
|
end;
|
||||||
DWORD=integer;
|
DWORD = Integer;
|
||||||
TLinger=Linger;
|
TLinger = Linger;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
type
|
type
|
||||||
TWSAStartup = function (wVersionRequired: word;
|
TWSAStartup = function(wVersionRequired: Word;
|
||||||
var WSData: TWSAData): Integer; stdcall;
|
var WSData: TWSAData): Integer; stdcall;
|
||||||
TWSACleanup = function : Integer; stdcall;
|
TWSACleanup = function: Integer; stdcall;
|
||||||
TWSAGetLastError = function : Integer; stdcall;
|
TWSAGetLastError = function: Integer; stdcall;
|
||||||
TGetServByName = function (name, proto: PChar): PServEnt; stdcall;
|
TGetServByName = function(name, proto: PChar): PServEnt; stdcall;
|
||||||
TGetServByPort = function (port: Integer; proto: PChar): PServEnt; stdcall;
|
TGetServByPort = function(port: Integer; proto: PChar): PServEnt; stdcall;
|
||||||
TGetProtoByName = function (name: PChar): PProtoEnt; stdcall;
|
TGetProtoByName = function(name: PChar): PProtoEnt; stdcall;
|
||||||
TGetProtoByNumber = function (proto: Integer): PProtoEnt; stdcall;
|
TGetProtoByNumber = function(proto: Integer): PProtoEnt; stdcall;
|
||||||
TGetHostByName = function (name: PChar): PHostEnt; stdcall;
|
TGetHostByName = function(name: PChar): PHostEnt; stdcall;
|
||||||
TGetHostByAddr = function (addr: Pointer; len, Struct: Integer): PHostEnt; stdcall;
|
TGetHostByAddr = function(addr: Pointer; len, Struc: Integer): PHostEnt; stdcall;
|
||||||
TGetHostName = function (name: PChar; len: Integer): Integer; stdcall;
|
TGetHostName = function(name: PChar; len: Integer): Integer; stdcall;
|
||||||
TShutdown = function (s: TSocket; how: Integer): Integer; stdcall;
|
TShutdown = function(s: TSocket; how: Integer): Integer; stdcall;
|
||||||
TSetSockOpt = function (s: TSocket; level, optname: Integer;
|
TSetSockOpt = function(s: TSocket; level, optname: Integer;
|
||||||
optval: PChar;
|
optval: PChar; optlen: Integer): Integer; stdcall;
|
||||||
optlen: Integer): Integer; stdcall;
|
TGetSockOpt = function(s: TSocket; level, optname: Integer;
|
||||||
TGetSockOpt = function (s: TSocket; level, optname: Integer;
|
optval: PChar; var optlen: Integer): Integer; stdcall;
|
||||||
optval: PChar;
|
TSendTo = function(s: TSocket; var Buf;
|
||||||
var optlen: Integer): Integer; stdcall;
|
len, flags: Integer; var addrto: TSockAddr;
|
||||||
TSendTo = function (s: TSocket; var Buf;
|
tolen: Integer): Integer; stdcall;
|
||||||
len, flags: Integer;
|
TSend = function(s: TSocket; var Buf;
|
||||||
var addrto: TSockAddr;
|
len, flags: Integer): Integer; stdcall;
|
||||||
tolen: Integer): Integer; stdcall;
|
TRecv = function(s: TSocket;
|
||||||
TSend = function (s: TSocket; var Buf;
|
var Buf; len, flags: Integer): Integer; stdcall;
|
||||||
len, flags: Integer): Integer; stdcall;
|
TRecvFrom = function(s: TSocket;
|
||||||
TRecv = function (s: TSocket;
|
var Buf; len, flags: Integer; var from: TSockAddr;
|
||||||
var Buf;
|
var fromlen: Integer): Integer; stdcall;
|
||||||
len, flags: Integer): Integer; stdcall;
|
Tntohs = function(netshort: u_short): u_short; stdcall;
|
||||||
TRecvFrom = function (s: TSocket;
|
Tntohl = function(netlong: u_long): u_long; stdcall;
|
||||||
var Buf; len, flags: Integer;
|
TListen = function(s: TSocket; backlog: Integer): Integer; stdcall;
|
||||||
var from: TSockAddr;
|
TIoctlSocket = function(s: TSocket; cmd: DWORD;
|
||||||
var fromlen: Integer): Integer; stdcall;
|
var arg: u_long): Integer; stdcall;
|
||||||
Tntohs = function (netshort: u_short): u_short; stdcall;
|
TInet_ntoa = function(inaddr: TInAddr): PChar; stdcall;
|
||||||
Tntohl = function (netlong: u_long): u_long; stdcall;
|
TInet_addr = function(cp: PChar): u_long; stdcall;
|
||||||
TListen = function (s: TSocket;
|
Thtons = function(hostshort: u_short): u_short; stdcall;
|
||||||
backlog: Integer): Integer; stdcall;
|
Thtonl = function(hostlong: u_long): u_long; stdcall;
|
||||||
TIoctlSocket = function (s: TSocket; cmd: DWORD;
|
TGetSockName = function(s: TSocket; var name: TSockAddr;
|
||||||
var arg: u_long): Integer; stdcall;
|
var namelen: Integer): Integer; stdcall;
|
||||||
TInet_ntoa = function (inaddr: TInAddr): PChar; stdcall;
|
TGetPeerName = function(s: TSocket; var name: TSockAddr;
|
||||||
TInet_addr = function (cp: PChar): u_long; stdcall;
|
var namelen: Integer): Integer; stdcall;
|
||||||
Thtons = function (hostshort: u_short): u_short; stdcall;
|
TConnect = function(s: TSocket; var name: TSockAddr;
|
||||||
Thtonl = function (hostlong: u_long): u_long; stdcall;
|
namelen: Integer): Integer; stdcall;
|
||||||
TGetSockName = function (s: TSocket; var name: TSockAddr;
|
TCloseSocket = function(s: TSocket): Integer; stdcall;
|
||||||
var namelen: Integer): Integer; stdcall;
|
TBind = function(s: TSocket; var addr: TSockAddr;
|
||||||
TGetPeerName = function (s: TSocket; var name: TSockAddr;
|
namelen: Integer): Integer; stdcall;
|
||||||
var namelen: Integer): Integer; stdcall;
|
TAccept = function(s: TSocket; addr: PSockAddr;
|
||||||
TConnect = function (s: TSocket; var name: TSockAddr;
|
addrlen: PInteger): TSocket; stdcall;
|
||||||
namelen: Integer): Integer; stdcall;
|
TSocketProc = function(af, Struc, Protocol: Integer): TSocket; stdcall;
|
||||||
TCloseSocket = function (s: TSocket): Integer; stdcall;
|
TSelect = function(nfds: Integer; readfds, writefds, exceptfds: PFDSet;
|
||||||
TBind = function (s: TSocket; var addr: TSockAddr;
|
timeout: PTimeVal): Longint; stdcall;
|
||||||
namelen: Integer): Integer; stdcall;
|
|
||||||
TAccept = function (s: TSocket; addr: PSockAddr;
|
|
||||||
addrlen: PInteger): TSocket; stdcall;
|
|
||||||
TSocketProc = function (af, Struct, protocol: Integer): TSocket; stdcall;
|
|
||||||
TSelect = function (nfds: Integer; readfds, writefds, exceptfds: PFDSet;
|
|
||||||
timeout: PTimeVal): Longint; stdcall;
|
|
||||||
|
|
||||||
var
|
var
|
||||||
WSAStartup : TWSAStartup =nil;
|
WSAStartup: TWSAStartup = nil;
|
||||||
WSACleanup : TWSACleanup =nil;
|
WSACleanup: TWSACleanup = nil;
|
||||||
WSAGetLastError : TWSAGetLastError =nil;
|
WSAGetLastError: TWSAGetLastError = nil;
|
||||||
GetServByName : TGetServByName =nil;
|
GetServByName: TGetServByName = nil;
|
||||||
GetServByPort : TGetServByPort =nil;
|
GetServByPort: TGetServByPort = nil;
|
||||||
GetProtoByName : TGetProtoByName =nil;
|
GetProtoByName: TGetProtoByName = nil;
|
||||||
GetProtoByNumber : TGetProtoByNumber =nil;
|
GetProtoByNumber: TGetProtoByNumber = nil;
|
||||||
GetHostByName : TGetHostByName =nil;
|
GetHostByName: TGetHostByName = nil;
|
||||||
GetHostByAddr : TGetHostByAddr =nil;
|
GetHostByAddr: TGetHostByAddr = nil;
|
||||||
GetHostName : TGetHostName =nil;
|
GetHostName: TGetHostName = nil;
|
||||||
Shutdown : TShutdown =nil;
|
Shutdown: TShutdown = nil;
|
||||||
SetSockOpt : TSetSockOpt =nil;
|
SetSockOpt: TSetSockOpt = nil;
|
||||||
GetSockOpt : TGetSockOpt =nil;
|
GetSockOpt: TGetSockOpt = nil;
|
||||||
SendTo : TSendTo =nil;
|
SendTo: TSendTo = nil;
|
||||||
Send : TSend =nil;
|
Send: TSend = nil;
|
||||||
Recv : TRecv =nil;
|
Recv: TRecv = nil;
|
||||||
RecvFrom : TRecvFrom =nil;
|
RecvFrom: TRecvFrom = nil;
|
||||||
ntohs : Tntohs =nil;
|
ntohs: Tntohs = nil;
|
||||||
ntohl : Tntohl =nil;
|
ntohl: Tntohl = nil;
|
||||||
Listen : TListen =nil;
|
Listen: TListen = nil;
|
||||||
IoctlSocket : TIoctlSocket =nil;
|
IoctlSocket: TIoctlSocket = nil;
|
||||||
Inet_ntoa : TInet_ntoa =nil;
|
Inet_ntoa: TInet_ntoa = nil;
|
||||||
Inet_addr : TInet_addr =nil;
|
Inet_addr: TInet_addr = nil;
|
||||||
htons : Thtons =nil;
|
htons: Thtons = nil;
|
||||||
htonl : Thtonl =nil;
|
htonl: Thtonl = nil;
|
||||||
GetSockName : TGetSockName =nil;
|
GetSockName: TGetSockName = nil;
|
||||||
GetPeerName : TGetPeerName =nil;
|
GetPeerName: TGetPeerName = nil;
|
||||||
Connect : TConnect =nil;
|
Connect: TConnect = nil;
|
||||||
CloseSocket : TCloseSocket =nil;
|
CloseSocket: TCloseSocket = nil;
|
||||||
Bind : TBind =nil;
|
Bind: TBind = nil;
|
||||||
Accept : TAccept =nil;
|
Accept: TAccept = nil;
|
||||||
Socket : TSocketProc =nil;
|
Socket: TSocketProc = nil;
|
||||||
Select : TSelect =nil;
|
Select: TSelect = nil;
|
||||||
|
|
||||||
function InitSocketInterface(stack:string):Boolean;
|
function InitSocketInterface(stack: string): Boolean;
|
||||||
function DestroySocketInterface:Boolean;
|
function DestroySocketInterface: Boolean;
|
||||||
|
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
function LSWSAStartup (wVersionRequired: Word; var WSData: TWSAData): Integer; stdcall;
|
function LSWSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer; stdcall;
|
||||||
function LSWSACleanup : Integer; stdcall;
|
function LSWSACleanup: Integer; stdcall;
|
||||||
function LSWSAGetLastError : Integer; stdcall;
|
function LSWSAGetLastError: Integer; stdcall;
|
||||||
function LSGetServByName (name, proto: PChar): PServEnt; stdcall;
|
function LSGetServByName(name, proto: PChar): PServEnt; stdcall;
|
||||||
function LSGetServByPort (port: Integer; proto: PChar): PServEnt; stdcall;
|
function LSGetServByPort(port: Integer; proto: PChar): PServEnt; stdcall;
|
||||||
function LSGetProtoByName (name: PChar): PProtoEnt; stdcall;
|
function LSGetProtoByName(name: PChar): PProtoEnt; stdcall;
|
||||||
function LSGetProtoByNumber (proto: Integer): PProtoEnt; stdcall;
|
function LSGetProtoByNumber(proto: Integer): PProtoEnt; stdcall;
|
||||||
function LSGetHostByName (name: PChar): PHostEnt; stdcall;
|
function LSGetHostByName(name: PChar): PHostEnt; stdcall;
|
||||||
function LSGetHostByAddr (addr: Pointer; len, Struct: Integer): PHostEnt; stdcall;
|
function LSGetHostByAddr(addr: Pointer; len, Struc: Integer): PHostEnt; stdcall;
|
||||||
function LSGetHostName (name: PChar; len: Integer): Integer; stdcall;
|
function LSGetHostName(name: PChar; len: Integer): Integer; stdcall;
|
||||||
function LSShutdown (s: TSocket; how: Integer): Integer; stdcall;
|
function LSShutdown(s: TSocket; how: Integer): Integer; stdcall;
|
||||||
function LSSetSockOpt (s: TSocket; level, optname: Integer; optval: PChar; optlen: Integer): Integer; stdcall;
|
function LSSetSockOpt(s: TSocket; level, optname: Integer; optval: PChar;
|
||||||
function LSGetSockOpt (s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer; stdcall;
|
optlen: Integer): Integer; stdcall;
|
||||||
function LSSendTo (s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; stdcall;
|
function LSGetSockOpt(s: TSocket; level, optname: Integer; optval: PChar;
|
||||||
function LSSend (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
|
var optlen: Integer): Integer; stdcall;
|
||||||
function LSRecv (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
|
function LSSendTo(s: TSocket; var Buf; len, flags: Integer;
|
||||||
function LSRecvFrom (s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
|
var addrto: TSockAddr; tolen: Integer): Integer; stdcall;
|
||||||
function LSntohs (netshort: u_short): u_short; stdcall;
|
function LSSend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
|
||||||
function LSntohl (netlong: u_long): u_long; stdcall;
|
function LSRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
|
||||||
function LSListen (s: TSocket; backlog: Integer): Integer; stdcall;
|
function LSRecvFrom(s: TSocket; var Buf; len, flags: Integer;
|
||||||
function LSIoctlSocket (s: TSocket; cmd: DWORD; var arg: u_long): Integer; stdcall;
|
var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
|
||||||
function LSInet_ntoa (inaddr: TInAddr): PChar; stdcall;
|
function LSntohs(netshort: u_short): u_short; stdcall;
|
||||||
function LSInet_addr (cp: PChar): u_long; stdcall;
|
function LSntohl(netlong: u_long): u_long; stdcall;
|
||||||
function LShtons (hostshort: u_short): u_short; stdcall;
|
function LSListen(s: TSocket; backlog: Integer): Integer; stdcall;
|
||||||
function LShtonl (hostlong: u_long): u_long; stdcall;
|
function LSIoctlSocket(s: TSocket; cmd: DWORD; var arg: u_long): Integer; stdcall;
|
||||||
function LSGetSockName (s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
|
function LSInet_ntoa(inaddr: TInAddr): PChar; stdcall;
|
||||||
function LSGetPeerName (s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
|
function LSInet_addr(cp: PChar): u_long; stdcall;
|
||||||
function LSConnect (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
|
function LShtons(hostshort: u_short): u_short; stdcall;
|
||||||
function LSCloseSocket (s: TSocket): Integer; stdcall;
|
function LShtonl(hostlong: u_long): u_long; stdcall;
|
||||||
function LSBind (s: TSocket; var addr: TSockAddr; namelen: Integer): Integer; stdcall;
|
function LSGetSockName(s: TSocket; var name: TSockAddr;
|
||||||
function LSAccept (s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
|
var namelen: Integer): Integer; stdcall;
|
||||||
function LSSocketProc (af, Struct, protocol: Integer): TSocket; stdcall;
|
function LSGetPeerName(s: TSocket; var name: TSockAddr;
|
||||||
function LSSelect (nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint; stdcall;
|
var namelen: Integer): Integer; stdcall;
|
||||||
|
function LSConnect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
|
||||||
|
function LSCloseSocket(s: TSocket): Integer; stdcall;
|
||||||
|
function LSBind(s: TSocket; var addr: TSockAddr; namelen: Integer): Integer; stdcall;
|
||||||
|
function LSAccept(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
|
||||||
|
function LSSocketProc(af, Struc, Protocol: Integer): TSocket; stdcall;
|
||||||
|
function LSSelect(nfds: Integer; readfds, writefds, exceptfds: PFDSet;
|
||||||
|
timeout: PTimeVal): Longint; stdcall;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
function LSWSAStartup (wVersionRequired: Word; var WSData: TWSAData): Integer;
|
|
||||||
|
function LSWSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer;
|
||||||
begin
|
begin
|
||||||
WSData.wVersion:=wVersionRequired;
|
with WSData do
|
||||||
WSData.wHighVersion:=$101;
|
begin
|
||||||
WSData.szDescription:='Synapse Platform Independent Socket Layer';
|
wVersion := wVersionRequired;
|
||||||
WSData.szSystemStatus:='On Linux';
|
wHighVersion := $101;
|
||||||
WSData.iMaxSockets:=32768;
|
szDescription := 'Synapse Platform Independent Socket Layer';
|
||||||
WSData.iMaxUdpDg:=8192;
|
szSystemStatus := 'On Linux';
|
||||||
result:=0;
|
iMaxSockets := 32768;
|
||||||
|
iMaxUdpDg := 8192;
|
||||||
|
end;
|
||||||
|
Result := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSWSACleanup : Integer;
|
function LSWSACleanup: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=0;
|
Result := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSWSAGetLastError : Integer;
|
function LSWSAGetLastError: Integer;
|
||||||
begin
|
begin
|
||||||
result:=System.GetLastError;
|
Result := System.GetLastError;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetServByName (name, proto: PChar): PServEnt;
|
function LSGetServByName(name, proto: PChar): PServEnt;
|
||||||
begin
|
begin
|
||||||
result:=libc.GetServByName(name,proto);
|
Result := libc.GetServByName(name, proto);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetServByPort (port: Integer; proto: PChar): PServEnt;
|
function LSGetServByPort(port: Integer; proto: PChar): PServEnt;
|
||||||
begin
|
begin
|
||||||
result:=libc.GetServByPort(port,proto);
|
Result := libc.GetServByPort(port, proto);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetProtoByName (name: PChar): PProtoEnt;
|
function LSGetProtoByName(name: PChar): PProtoEnt;
|
||||||
begin
|
begin
|
||||||
result:=libc.getprotobyname(Name);
|
Result := libc.GetProtoByName(Name);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetProtoByNumber (proto: Integer): PProtoEnt;
|
function LSGetProtoByNumber(proto: Integer): PProtoEnt;
|
||||||
begin
|
begin
|
||||||
result:=libc.getprotobynumber(proto);
|
Result := libc.GetProtoByNumber(proto);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetHostByName (name: PChar): PHostEnt;
|
function LSGetHostByName(name: PChar): PHostEnt;
|
||||||
begin
|
begin
|
||||||
result:=libc.GetHostByName(Name);
|
Result := libc.GetHostByName(Name);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetHostByAddr (addr: Pointer; len, Struct: Integer): PHostEnt;
|
function LSGetHostByAddr(addr: Pointer; len, Struc: Integer): PHostEnt;
|
||||||
begin
|
begin
|
||||||
Result:=libc.GetHostByAddr(Addr,len,struct);
|
Result := libc.GetHostByAddr(Addr, len, struc);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetHostName (name: PChar; len: Integer): Integer;
|
function LSGetHostName(name: PChar; len: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
Result:=libc.GetHostName(Name,Len);
|
Result := libc.GetHostName(Name, Len);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSShutdown (s: TSocket; how: Integer): Integer;
|
function LSShutdown(s: TSocket; how: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.Shutdown(S,How);
|
Result := libc.Shutdown(S, How);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSSetSockOpt (s: TSocket; level, optname: Integer; optval: PChar; optlen: Integer): Integer;
|
function LSSetSockOpt(s: TSocket; level, optname: Integer; optval: PChar;
|
||||||
|
optlen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.SetSockOpt(S,Level,OptName,OptVal,OptLen);
|
Result := libc.SetSockOpt(S, Level, OptName, OptVal, OptLen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetSockOpt (s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer;
|
function LSGetSockOpt(s: TSocket; level, optname: Integer; optval: PChar;
|
||||||
|
var optlen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.getsockopt(s,level,optname,optval,cardinal(optlen));
|
Result := libc.getsockopt(s, level, optname, optval, cardinal(optlen));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSSendTo (s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer;
|
function LSSendTo(s: TSocket; var Buf; len, flags: Integer;
|
||||||
|
var addrto: TSockAddr; tolen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.SendTo(S,Buf,Len,Flags,Addrto,Tolen);
|
Result := libc.SendTo(S, Buf, Len, Flags, Addrto, Tolen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSSend (s: TSocket; var Buf; len, flags: Integer): Integer;
|
function LSSend(s: TSocket; var Buf; len, flags: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.Send(S,Buf,Len,Flags);
|
Result := libc.Send(S, Buf, Len, Flags);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSRecv (s: TSocket; var Buf; len, flags: Integer): Integer;
|
function LSRecv(s: TSocket; var Buf; len, flags: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.Recv(S,Buf,Len,Flags);
|
Result := libc.Recv(S, Buf, Len, Flags);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSRecvFrom (s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer;
|
function LSRecvFrom(s: TSocket; var Buf; len, flags: Integer;
|
||||||
|
var from: TSockAddr; var fromlen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.RecvFrom(S,Buf,Len,Flags,@from,@fromlen);
|
Result := libc.RecvFrom(S, Buf, Len, Flags, @from, @fromlen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSntohs (netshort: u_short): u_short;
|
function LSntohs(netshort: u_short): u_short;
|
||||||
begin
|
begin
|
||||||
Result:=libc.NToHS(netshort);
|
Result := libc.NToHS(netshort);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSntohl (netlong: u_long): u_long;
|
function LSntohl(netlong: u_long): u_long;
|
||||||
begin
|
begin
|
||||||
Result:=libc.NToHL(netlong);
|
Result := libc.NToHL(netlong);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSListen (s: TSocket; backlog: Integer): Integer;
|
function LSListen(s: TSocket; backlog: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.Listen(S,Backlog);
|
Result := libc.Listen(S, Backlog);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSIoctlSocket (s: TSocket; cmd: DWORD; var arg: u_long): Integer;
|
function LSIoctlSocket(s: TSocket; cmd: DWORD; var arg: u_long): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.ioctl(s,cmd,@arg);
|
Result := libc.ioctl(s, cmd, @arg);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSInet_ntoa (inaddr: TInAddr): PChar;
|
function LSInet_ntoa(inaddr: TInAddr): PChar;
|
||||||
begin
|
begin
|
||||||
result:=libc.inet_ntoa(inaddr);
|
Result := libc.inet_ntoa(inaddr);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSInet_addr (cp: PChar): u_long;
|
function LSInet_addr(cp: PChar): u_long;
|
||||||
begin
|
begin
|
||||||
result:=libc.inet_addr(cp);
|
Result := libc.inet_addr(cp);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LShtons (hostshort: u_short): u_short;
|
function LShtons(hostshort: u_short): u_short;
|
||||||
begin
|
begin
|
||||||
result:=libc.HToNs(HostShort);
|
Result := libc.HToNs(HostShort);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LShtonl (hostlong: u_long): u_long;
|
function LShtonl(hostlong: u_long): u_long;
|
||||||
begin
|
begin
|
||||||
Result:=libc.HToNL(HostLong);
|
Result := libc.HToNL(HostLong);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetSockName (s: TSocket; var name: TSockAddr; var namelen: Integer): Integer;
|
function LSGetSockName(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
Result:=libc.GetSockName(S,Name,cardinal(namelen));
|
Result := libc.GetSockName(S, Name, cardinal(namelen));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSGetPeerName (s: TSocket; var name: TSockAddr; var namelen: Integer): Integer;
|
function LSGetPeerName(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
Result:=libc.GetPeerName(S,Name,cardinal(namelen));
|
Result := libc.GetPeerName(S, Name, cardinal(namelen));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSConnect (s: TSocket; var name: TSockAddr; namelen: Integer): Integer;
|
function LSConnect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.Connect(S,name,namelen);
|
Result := libc.Connect(S, name, namelen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSCloseSocket (s: TSocket): Integer;
|
function LSCloseSocket(s: TSocket): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.__close(s);
|
Result := libc.__close(s);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSBind (s: TSocket; var addr: TSockAddr; namelen: Integer): Integer;
|
function LSBind(s: TSocket; var addr: TSockAddr; namelen: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
result:=libc.Bind(S,addr,namelen);
|
Result := libc.Bind(S, addr, namelen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSAccept (s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket;
|
function LSAccept(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket;
|
||||||
begin
|
begin
|
||||||
result:=libc.Accept(S,addr,psocketlength(addrlen));
|
Result := libc.Accept(S, addr, psocketlength(addrlen));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSSocketProc (af, Struct, protocol: Integer): TSocket;
|
function LSSocketProc(af, Struc, Protocol: Integer): TSocket;
|
||||||
begin
|
begin
|
||||||
result:=libc.Socket(Af,Struct,Protocol);
|
Result := libc.Socket(Af, Struc, Protocol);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LSSelect (nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint;
|
function LSSelect(nfds: Integer; readfds, writefds, exceptfds: PFDSet;
|
||||||
|
timeout: PTimeVal): Longint;
|
||||||
begin
|
begin
|
||||||
Result:=libc.Select(nfds,readfds,writefds,exceptfds,timeout);
|
Result := libc.Select(nfds, readfds, writefds, exceptfds, timeout);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
function InitSocketInterface(stack: string): Boolean;
|
||||||
function InitSocketInterface(stack:string):Boolean;
|
|
||||||
begin
|
begin
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
Accept := LSAccept;
|
Accept := LSAccept;
|
||||||
@ -451,72 +461,71 @@ begin
|
|||||||
SetSockOpt := LSsetsockopt;
|
SetSockOpt := LSsetsockopt;
|
||||||
ShutDown := LSshutdown;
|
ShutDown := LSshutdown;
|
||||||
Socket := LSsocketProc;
|
Socket := LSsocketProc;
|
||||||
GetHostByAddr := LSgethostbyaddr;
|
GetHostByAddr := LSGetHostByAddr;
|
||||||
GetHostByName := LSgethostbyname;
|
GetHostByName := LSGetHostByName;
|
||||||
GetProtoByName := LSgetprotobyname;
|
GetProtoByName := LSGetProtoByName;
|
||||||
GetProtoByNumber := LSgetprotobynumber;
|
GetProtoByNumber := LSGetProtoByNumber;
|
||||||
GetServByName := LSgetservbyname;
|
GetServByName := LSGetServByName;
|
||||||
GetServByPort := LSgetservbyport;
|
GetServByPort := LSGetServByPort;
|
||||||
GetHostName := LSgethostname;
|
GetHostName := LSGetHostName;
|
||||||
WSAGetLastError := LSWSAGetLastError;
|
WSAGetLastError := LSWSAGetLastError;
|
||||||
WSAStartup := LSWSAStartup;
|
WSAStartup := LSWSAStartup;
|
||||||
WSACleanup := LSWSACleanup;
|
WSACleanup := LSWSACleanup;
|
||||||
Result:=True;
|
Result := True;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
Result:=False;
|
Result := False;
|
||||||
if stack=''
|
if stack = '' then
|
||||||
then stack:=DLLStackName;
|
stack := DLLStackName;
|
||||||
LibHandle := Windows.LoadLibrary(PChar(Stack));
|
LibHandle := Windows.LoadLibrary(PChar(Stack));
|
||||||
if LibHandle <> 0 then begin
|
if LibHandle <> 0 then
|
||||||
Accept := Windows.GetProcAddress (LibHandle, PChar('accept'));
|
begin
|
||||||
Bind := Windows.GetProcAddress (LibHandle, PChar('bind'));
|
Accept := Windows.GetProcAddress(LibHandle, PChar('accept'));
|
||||||
CloseSocket := Windows.GetProcAddress (LibHandle, PChar('closesocket'));
|
Bind := Windows.GetProcAddress(LibHandle, PChar('bind'));
|
||||||
Connect := Windows.GetProcAddress (LibHandle, PChar('connect'));
|
CloseSocket := Windows.GetProcAddress(LibHandle, PChar('closesocket'));
|
||||||
GetPeerName := Windows.GetProcAddress (LibHandle, PChar('getpeername'));
|
Connect := Windows.GetProcAddress(LibHandle, PChar('connect'));
|
||||||
GetSockName := Windows.GetProcAddress (LibHandle, PChar('getsockname'));
|
GetPeerName := Windows.GetProcAddress(LibHandle, PChar('getpeername'));
|
||||||
GetSockOpt := Windows.GetProcAddress (LibHandle, PChar('getsockopt'));
|
GetSockName := Windows.GetProcAddress(LibHandle, PChar('getsockname'));
|
||||||
Htonl := Windows.GetProcAddress (LibHandle, PChar('htonl'));
|
GetSockOpt := Windows.GetProcAddress(LibHandle, PChar('getsockopt'));
|
||||||
Htons := Windows.GetProcAddress (LibHandle, PChar('htons'));
|
Htonl := Windows.GetProcAddress(LibHandle, PChar('htonl'));
|
||||||
Inet_Addr := Windows.GetProcAddress (LibHandle, PChar('inet_addr'));
|
Htons := Windows.GetProcAddress(LibHandle, PChar('htons'));
|
||||||
Inet_Ntoa := Windows.GetProcAddress (LibHandle, PChar('inet_ntoa'));
|
Inet_Addr := Windows.GetProcAddress(LibHandle, PChar('inet_addr'));
|
||||||
IoctlSocket := Windows.GetProcAddress (LibHandle, PChar('ioctlsocket'));
|
Inet_Ntoa := Windows.GetProcAddress(LibHandle, PChar('inet_ntoa'));
|
||||||
Listen := Windows.GetProcAddress (LibHandle, PChar('listen'));
|
IoctlSocket := Windows.GetProcAddress(LibHandle, PChar('ioctlsocket'));
|
||||||
Ntohl := Windows.GetProcAddress (LibHandle, PChar('ntohl'));
|
Listen := Windows.GetProcAddress(LibHandle, PChar('listen'));
|
||||||
Ntohs := Windows.GetProcAddress (LibHandle, PChar('ntohs'));
|
Ntohl := Windows.GetProcAddress(LibHandle, PChar('ntohl'));
|
||||||
Recv := Windows.GetProcAddress (LibHandle, PChar('recv'));
|
Ntohs := Windows.GetProcAddress(LibHandle, PChar('ntohs'));
|
||||||
RecvFrom := Windows.GetProcAddress (LibHandle, PChar('recvfrom'));
|
Recv := Windows.GetProcAddress(LibHandle, PChar('recv'));
|
||||||
Select := Windows.GetProcAddress (LibHandle, PChar('select'));
|
RecvFrom := Windows.GetProcAddress(LibHandle, PChar('recvfrom'));
|
||||||
Send := Windows.GetProcAddress (LibHandle, PChar('send'));
|
Select := Windows.GetProcAddress(LibHandle, PChar('select'));
|
||||||
SendTo := Windows.GetProcAddress (LibHandle, PChar('sendto'));
|
Send := Windows.GetProcAddress(LibHandle, PChar('send'));
|
||||||
SetSockOpt := Windows.GetProcAddress (LibHandle, PChar('setsockopt'));
|
SendTo := Windows.GetProcAddress(LibHandle, PChar('sendto'));
|
||||||
ShutDown := Windows.GetProcAddress (LibHandle, PChar('shutdown'));
|
SetSockOpt := Windows.GetProcAddress(LibHandle, PChar('setsockopt'));
|
||||||
Socket := Windows.GetProcAddress (LibHandle, PChar('socket'));
|
ShutDown := Windows.GetProcAddress(LibHandle, PChar('shutdown'));
|
||||||
GetHostByAddr := Windows.GetProcAddress (LibHandle, PChar('gethostbyaddr'));
|
Socket := Windows.GetProcAddress(LibHandle, PChar('socket'));
|
||||||
GetHostByName := Windows.GetProcAddress (LibHandle, PChar('gethostbyname'));
|
GetHostByAddr := Windows.GetProcAddress(LibHandle, PChar('gethostbyaddr'));
|
||||||
GetProtoByName := Windows.GetProcAddress (LibHandle, PChar('getprotobyname'));
|
GetHostByName := Windows.GetProcAddress(LibHandle, PChar('gethostbyname'));
|
||||||
GetProtoByNumber := Windows.GetProcAddress (LibHandle, PChar('getprotobynumber'));
|
GetProtoByName := Windows.GetProcAddress(LibHandle, PChar('getprotobyname'));
|
||||||
GetServByName := Windows.GetProcAddress (LibHandle, PChar('getservbyname'));
|
GetProtoByNumber := Windows.GetProcAddress(LibHandle, PChar('getprotobynumber'));
|
||||||
GetServByPort := Windows.GetProcAddress (LibHandle, PChar('getservbyport'));
|
GetServByName := Windows.GetProcAddress(LibHandle, PChar('getservbyname'));
|
||||||
GetHostName := Windows.GetProcAddress (LibHandle, PChar('gethostname'));
|
GetServByPort := Windows.GetProcAddress(LibHandle, PChar('getservbyport'));
|
||||||
WSAGetLastError := Windows.GetProcAddress (LibHandle, PChar('WSAGetLastError'));
|
GetHostName := Windows.GetProcAddress(LibHandle, PChar('gethostname'));
|
||||||
WSAStartup := Windows.GetProcAddress (LibHandle, PChar('WSAStartup'));
|
WSAGetLastError := Windows.GetProcAddress(LibHandle, PChar('WSAGetLastError'));
|
||||||
WSACleanup := Windows.GetProcAddress (LibHandle, PChar('WSACleanup'));
|
WSAStartup := Windows.GetProcAddress(LibHandle, PChar('WSAStartup'));
|
||||||
Result:=True;
|
WSACleanup := Windows.GetProcAddress(LibHandle, PChar('WSACleanup'));
|
||||||
|
Result := True;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function DestroySocketInterface:Boolean;
|
function DestroySocketInterface: Boolean;
|
||||||
begin
|
begin
|
||||||
{$IFDEF LINUX}
|
{$IFDEF LINUX}
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
if LibHandle <> 0 then begin
|
if LibHandle <> 0 then
|
||||||
Windows.FreeLibrary(libHandle);
|
Windows.FreeLibrary(libHandle);
|
||||||
end;
|
|
||||||
LibHandle := 0;
|
LibHandle := 0;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Result:=True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user