program testcb;

(* Program to test callbacks *)

{$INCLUDE curltest.inc}

uses curlobj;


function MyProgressCallback (
   UserData:pointer; DownloadTotal, DownloadNow, UploadTotal, UploadNow:Double): LongInt; cdecl;
begin
  inc(LongInt(UserData^));
  Write( 'Progress Function: ');
  // If we know the expected size of the file, then show percent complete, 
  // else just show the number of bytes received...
  if ( DownloadTotal > 0 ) 
  then WriteLn ( Trunc( (DownloadNow/DownloadTotal) * 100 ), '%' )
  else WriteLn ( Trunc(DownloadNow), ' bytes.' );

  Result:=0;
end;  



// My   *silly*   write function just counts the number of "<" characters.
// Your *serious* write function will probably want to do something else...
function MyWriteFunction (
    IncomingData: pChar; ItemSize, ItemCount:LongWord; UserData:pointer):LongWord; cdecl;

var I:LongInt;
begin
  Result:= ( ItemSize * ItemCount );
  for I:=0 to Result-1 do if ( IncomingData[I] = '<' ) then inc( LongInt(UserData^) );
  WriteLn('Write Function : ', Result, ' bytes');
end;  


// My header function just tries to get the server info header...
function MyHeaderFunction (
    Hdr: pChar; ItemSize, ItemCount:LongWord; UserData:pointer):LongWord; cdecl;
begin
  Result:= ( ItemSize * ItemCount );
  if ( curl_strnequal(Hdr, 'Server:', 7) <> 0 ) then string(UserData^):=Copy(Hdr, 7, Result-7);
  WriteLn('Header Function: ', Result, ' bytes');
end;  


function MyDebugFunction (
    handle: pCurl; infotype: Curl_InfoType; data:pChar; size:LongWord; UserData:pointer):LongInt; cdecl;
begin
  inc(LongInt(UserData^));
  case InfoType of
    CURLINFO_TEXT:         Write('-> Debug: ', Copy(data, 1, size));
    CURLINFO_HEADER_IN:  WriteLn('-> Debug: GOT RESPONSE HEADER');
    CURLINFO_HEADER_OUT: WriteLn('-> Debug: SENT REQUEST HEADER');
    CURLINFO_DATA_IN:;
    CURLINFO_DATA_OUT:;
    else WriteLn('-> Debug: THIS SHOULD NEVER HAPPEN!!!');
  end;  
  Result:=0;
end;  


var 
  MyCurl:tCurl;
  ProgCount:  LongInt;
  TagCount:   LongInt;
  DebugCount: LongInt;
  ServerType: String;
begin

  ProgCount  := 0;
  TagCount   := 0;
  DebugCount := 0;
  ServerType := '';

  MyCurl:=tCurl.Create(nil);

  if ( ParamCount = 1 )
  then MyCurl.URL:=ParamStr(1)
  else MyCurl.URL:='http://www.aol.com';

  MyCurl.FollowLocation:=True;

  MyCurl.WriteFunction := @MyWriteFunction;  
  MyCurl.OutputStream:=@TagCount;   

  MyCurl.HeaderFunction := @MyHeaderFunction;  
  MyCurl.HeaderStream:=@ServerType;

  MyCurl.Verbose:=True;
  MyCurl.DebugFunction := @MyDebugFunction;  
  MyCurl.DebugData := @DebugCount;

  MyCurl.NoProgress:=False;
  MyCurl.ProgressFunction :=@MyProgressCallback;
  MyCurl.ProgressData:=@ProgCount;
    
  if MyCurl.Perform then begin 
    WriteLn('Received ', MyCurl.SizeDownload, ' bytes') ;
    WriteLn('The ProgressFunction was called ', ProgCount,  ' times.');
    WriteLn('The DebugFunction was called ',    DebugCount, ' times.');
    WriteLn('The web page contains about ',    TagCount,   ' html tags.');
    if ( ServerType <> '' ) 
    then WriteLn('This site is running', ServerType) 
    else WriteLn('Unable to determine server type.');
  end else WriteLn('Transfer failed: ', MyCurl.ErrorString);

  MyCurl.Free;

end.


Get CurlPas and TidyPas at SourceForge.net. Fast, secure and Free Open Source software downloads