with System;
with Adacurl; use Adacurl;
package Adacurl.Multi is
subtype CURLM is System.Address;
type CURLM_P is access all CURLM;
type CURLMcode is (CURLM_CALL_MULTI_PERFORM,
CURLM_OK,
CURLM_BAD_HANDLE,
CURLM_BAD_EASY_HANDLE,
CURLM_OUT_OF_MEMORY,
CURLM_INTERNAL_ERROR,
CURLM_LAST);
for CURLMcode use (CURLM_CALL_MULTI_PERFORM => -1,
CURLM_OK => 0,
CURLM_BAD_HANDLE => 1,
CURLM_BAD_EASY_HANDLE => 2,
CURLM_OUT_OF_MEMORY => 3,
CURLM_INTERNAL_ERROR => 4,
CURLM_LAST => 5);
pragma Convention(C,CURLMcode);
type CURL_MSG is (CURLMSG_NONE,
CURLMSG_DONE,
CURLMSG_LAST);
pragma Convention(C,CURL_MSG);
type Data_Union_Range is new Positive range 1..2;
type Data_Union (Which : Data_Union_Range := 1) is record
case Which is
when 1 =>
Whatever : System.Address;
when 2 =>
Result : CURLcode;
end case;
end record;
pragma Unchecked_Union(Data_Union);
type CURLMsg is record
Msg : CURL_MSG;
Easy_Handle : CURL_P;
Data : Data_Union;
end record;
pragma Convention(C,Curlmsg);
type CURLMsg_P is access all CURLMsg;
pragma Convention(C,Curlmsg_P);
function Curl_Multi_Init return CURLM_P;
function Curl_Multi_Add_Handle(Multi_Handle : CURLM_P;
Curl_Handle : CURLM_P) return CURLMcode;
function Curl_Multi_Remove_Handle(Multi_Handle : CURLM_P;
Curl_Handle : CURLM_P)
return CURLMcode;
-- Use POSIX style fd_set
ALIGNMENT : constant :=
Natural'Min (Standard'Maximum_Alignment,8);
type Fd_Set is array (1 .. 32) of int;
for Fd_Set'Alignment use ALIGNMENT;
for Fd_Set'Size use 1024;
pragma Convention (C,Fd_Set);
type Fd_Set_P is access all Fd_Set;
pragma Convention (C, Fd_Set_P);
function Curl_Multi_Fdset(Multi_Handle : CURLM_P;
Read_Fd_Set : Fd_Set;
Write_Fd_Set : Fd_Set;
Exc_Fd_Se : Fd_Set;
Max_Fd : access Int) return CURLMcode;
function curl_multi_perform(Multi_Handle : CURLM_P;
Running_Handles : access Int)
return CURLMcode;
function curl_multi_cleanup(Multi_Handle : CURLM_P) return CURLMcode;
function Curl_Multi_Info_Read(Multi_Handle : CURLM_P;
Msgs_In_Queue : access Int)
return CURLMsg_P;
private
pragma Import(C,Curl_Multi_Init,"curl_multi_Init");
pragma Import(C,Curl_Multi_Add_Handle,"curl_multi_add_handle");
pragma Import(C,Curl_Multi_Cleanup,"curl_multi_cleanup");
pragma Import(C,Curl_Multi_Fdset,"curl_multi_fdset");
pragma Import(C,Curl_Multi_Info_Read,"curl_multi_info_read");
pragma Import(C,Curl_Multi_Perform,"curl_multi_perform");
pragma Import(C,Curl_Multi_Remove_Handle,"curl_multi_remove_handle");
end Adacurl.Multi;