Advertisement
mixster

mixster

Jul 22nd, 2009
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.36 KB | None | 0 0
  1. //SCAR Plugin. Created for SCAR Divi by Kaitnieks & Freddy1990
  2. //Check "Accessable SCAR Functions.txt" for which functions you can call from SCAR
  3. library ListenSocket;
  4.  
  5. uses
  6.   Forms,
  7.   FastShareMem,
  8.   SysUtils,
  9.   Classes,
  10.   Windows,
  11.   Graphics,
  12.   ScktComp;
  13.  
  14. {$R *.res}
  15.  
  16. type
  17.   TSCARPlugFunc = record
  18.     Name: string;
  19.     Ptr: Pointer;
  20.   end;
  21.  
  22.   TMessage = record
  23.     host, mess: string;
  24.   end;
  25.  
  26.   TMessArr = array of TMessage;
  27.  
  28.   TStringArray = array of string;
  29. type
  30.   THandleServer = class
  31.     ServerSock: TServerSocket;
  32.     messages: TMessArr;
  33.     constructor create;
  34.     procedure SetupServer(port: Integer);
  35.     procedure ServerSockRead(Sender: TObject; Socket: TCustomWinSocket);
  36.   end;
  37.  
  38. type
  39.   TConnection = record
  40.     Server: THandleServer;
  41.     Open: Boolean;
  42.   end;
  43.  
  44. var
  45.   Connections: array of TConnection;
  46.  
  47. constructor THandleServer.Create;
  48. begin
  49.   inherited;
  50.   ServerSock := TServerSocket.Create(nil);
  51. end;
  52.  
  53. procedure THandleServer.SetupServer(port: Integer);
  54. begin
  55.   ServerSock.Port := port;
  56.   ServerSock.ServerType := stNonBlocking;
  57.   ServerSock.OnClientRead := ServerSockRead;
  58.   ServerSock.Active := True;
  59. end;
  60.  
  61. procedure THandleServer.ServerSockRead(Sender: TObject; Socket: TCustomWinSocket);
  62. var
  63.   con, i: Integer;
  64.   inText, inHost: string;
  65. begin
  66.   for con := 0 to ServerSock.Socket.ActiveConnections - 1 do
  67.   begin
  68.     inText := ServerSock.Socket.Connections[con].ReceiveText;
  69.     inHost := ServerSock.Socket.Connections[con].RemoteAddress;
  70.     if ((inHost <> '') and (inText <> '')) then
  71.     begin
  72.       i := Length(messages);
  73.       SetLength(messages, i + 1);
  74.       messages[i].host := inHost;
  75.       messages[i].mess := inText;
  76.     end;
  77.   end;
  78. end;
  79.  
  80. function CreateServerConnection(port: Integer): Integer; stdcall;
  81. var
  82.   i, l: Integer;
  83. begin
  84.   i := 0;
  85.   try
  86.     l := Length(Connections);
  87.     if l  <> 0 then
  88.       for i := 0 to l - 1 do
  89.         if (Connections[i].Open) then
  90.           break;
  91.     if (i = l) then
  92.       SetLength(Connections, l + 1);
  93.  
  94.     Connections[i].Open := False;
  95.     Connections[i].Server := THandleServer.create;
  96.     Connections[i].Server.SetupServer(port);
  97.  
  98.     Result := i;
  99.  
  100.   except
  101.     Result := -1;
  102.   end;
  103. end;
  104.  
  105. function ReadServerData(num: Integer): TMessArr; stdcall;
  106. var
  107.   i: Integer;
  108. begin
  109.   if ((num < 0) or (num >= Length(Connections)) or (Connections[num].Open)) then
  110.     exit;
  111.   SetLength(Connections[num].Server.messages, 0);
  112.   try
  113.     Application.ProcessMessages;
  114.  
  115.     SetLength(Result, Length(Connections[num].Server.messages));
  116.     for i := 0 to Length(Connections[num].Server.messages) - 1 do
  117.     begin
  118.       Result[i].host := Connections[num].Server.messages[i].host;
  119.       Result[i].mess := Connections[num].Server.messages[i].mess;
  120.     end;
  121.   except
  122.   end;
  123. end;
  124.  
  125. function SendServerData(num: Integer; host, data: string): Boolean; stdcall;
  126. var
  127.   i: Integer;
  128. begin
  129.   if ((num < 0) or (num >= Length(Connections)) or (Connections[num].Open)) then
  130.   begin
  131.     Result := False;
  132.     exit;
  133.   end;
  134.  
  135.   try
  136.     try
  137.       i := StrToInt(host);
  138.       if ((i < 0) or (i >= Connections[num].Server.ServerSock.Socket.ActiveConnections)) then
  139.       begin
  140.         Result := False;
  141.         exit;
  142.       end;
  143.     except
  144.       for i := 0 to Connections[num].Server.ServerSock.Socket.ActiveConnections - 1 do
  145.         if (Connections[num].Server.ServerSock.Socket.Connections[i].RemoteHost = host) then
  146.           break;
  147.       if ((i = Connections[num].Server.ServerSock.Socket.ActiveConnections) or (not Connections[num].Server.ServerSock.Socket.Connections[i].Connected)) then
  148.       begin
  149.         Result := False;
  150.         exit;
  151.       end;
  152.     end;
  153.  
  154.     Connections[num].Server.ServerSock.Socket.Connections[i].SendText(data);
  155.  
  156.     Result := True;
  157.   except
  158.     Result := False;
  159.   end;
  160. end;
  161.  
  162. function GetServerClients(num: Integer): TStringArray; stdcall;
  163. var
  164.   i, l: Integer;
  165. begin
  166.   if ((num < 0) or (num >= Length(Connections)) or (Connections[num].Open) or (Connections[num].Server.ServerSock.Socket.ActiveConnections = 0)) then
  167.     exit;
  168.   try
  169.     l := Connections[num].Server.ServerSock.Socket.ActiveConnections;
  170.     SetLength(Result, l);
  171.     for i := 0 to l - 1 do
  172.     begin
  173.       Result[i] := StrAlloc(Length(Connections[num].Server.ServerSock.Socket.Connections[i].RemoteHost));
  174.       Result[i] := Connections[num].Server.ServerSock.Socket.Connections[i].RemoteHost;
  175.     end;
  176.   except
  177.   end;
  178. end;
  179.  
  180. function FreeServerConnection(num: Integer): Boolean; stdcall;
  181. begin
  182.   try
  183.     Connections[num].Open := True;
  184.     Connections[num].Server.ServerSock.Free;
  185.     Connections[num].Server.Free;
  186.  
  187.     if (num = Length(Connections) - 1) then
  188.       SetLength(Connections, num);
  189.     Result := True;
  190.   except
  191.     Result := False;
  192.   end;
  193. end;
  194.  
  195. function GetFunctionCount(): Integer; stdcall; export;
  196. begin
  197.   Result := 5;
  198. end;
  199.  
  200. function GetFunctionInfo(x: Integer; var ProcAddr: Pointer; var ProcDef: PChar): Integer; stdcall;
  201. begin
  202.   case x of
  203.     0:
  204.       begin
  205.         ProcAddr := @CreateServerConnection;
  206.         StrPCopy(ProcDef, 'function CreateServerConnection(port: Integer): Integer;');
  207.       end;
  208.     1:
  209.       begin
  210.         ProcAddr := @ReadServerData;
  211.         StrPCopy(ProcDef, 'function ReadServerData(num: Integer): TMessArr;');
  212.       end;
  213.     2:
  214.       begin
  215.         ProcAddr := @SendServerData;
  216.         StrPCopy(ProcDef, 'function SendServerData(num: Integer; host, data: string): Boolean;');
  217.       end;
  218.     3:
  219.       begin
  220.         ProcAddr := @GetServerClients;
  221.         StrPCopy(ProcDef, 'function GetServerClients(num: Integer): TStringArray;');
  222.       end;
  223.     4:
  224.       begin
  225.         ProcAddr := @FreeServerConnection;
  226.         StrPCopy(ProcDef, 'function FreeServerConnection(num: Integer): Boolean;');
  227.       end;
  228.   else
  229.     x := -1;
  230.   end;
  231.   Result := x;
  232. end;
  233.  
  234. function GetTypeCount(): Integer; stdcall; export;
  235. begin
  236.   Result := 2;
  237. end;
  238.  
  239. function GetTypeInfo(x: Integer; var sType, sTypeDef: string): Integer; stdcall;
  240. begin
  241.   case x of
  242.     0:
  243.       begin
  244.         sType := 'TMessage';
  245.         sTypeDef := 'record host, mess: string; end;';
  246.       end;
  247.     1:
  248.       begin
  249.         sType := 'TMessArr';
  250.         sTypeDef := 'array of TMessage;';
  251.       end;
  252.   else
  253.     x := -1;
  254.   end;
  255.   Result := x;
  256. end;
  257.  
  258. exports GetFunctionCount;
  259. exports GetFunctionInfo;
  260. exports GetTypeCount;
  261. exports GetTypeInfo;
  262. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement