{ A. Nasır Şentürk 2006 }
unit InterThr;

interface

uses Windows, Messages, Classes, Forms;

const
  WM_WEATHERDONE  = WM_USER + 10;
  CM_RESTORE      = WM_USER + 11;
  WM_IPADDRDONE   = WM_USER + 12;
  WM_CHECKVERDONE = WM_USER + 13;

type
  TInternetThread = class(TThread)
  private
    FControl: TForm;
    FURL: string;
    FResponseText: string;
    FStatus: Integer;
    FMessageCode: Cardinal;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean; AControl: TForm;
      const URL: string; const AMessageCode: Cardinal);
    property ResponseText: string read FResponseText;
    property Status: Integer read FStatus;
    property Terminated;
  end;

implementation

uses WinInet;

constructor TInternetThread.Create(CreateSuspended: Boolean; AControl: TForm;
  const URL: string; const AMessageCode: Cardinal);
begin
  inherited Create(CreateSuspended);
  FURL := URL;
  FControl := AControl;
  FMessageCode := AMessageCode;
  FResponseText := '';
end;

procedure TInternetThread.Execute;

  function GetXMLPage(const URL: string; out XMLPage: string): Integer;
  var
    hRootHandle, hUrlDump: HINTERNET;
    Buffer: array[0..8192] of Char;
    dwNumberOfBytes: DWORD;
    Stream: TStringStream;
    ReadResult: BOOL;
  begin

    Result := -1;

    hRootHandle := InternetOpen('FreeDelphi Weather XML',
      INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

    if hRootHandle = nil then Exit;

    hUrlDump := InternetOpenUrl(hRootHandle, PChar(URL), nil, 0,
      INTERNET_FLAG_RESYNCHRONIZE, 0);

    if hUrlDump <> nil then
    begin
      Stream := TStringStream.Create('');
      try
        repeat
          FillChar(Buffer, SizeOf(Buffer), 0);
          ReadResult := InternetReadFile(hUrlDump, @Buffer, SizeOf(Buffer), dwNumberOfBytes);
          if not ReadResult then Break;
          Stream.Write(Buffer, dwNumberOfBytes);
        until dwNumberOfBytes = 0;
        XMLPage := Stream.DataString;
        Result := 0;
      finally
        Stream.Free;
      end;
      InternetCloseHandle(hUrlDump);
    end;

    InternetCloseHandle(hRootHandle);

  end;

begin
  FStatus := GetXMLPage(FURL, FResponseText);
  PostMessage(FControl.Handle, FMessageCode, 0, FStatus);
end;

end.
