diff --git a/curl_default_function.e b/curl_default_function.e index 111011b8..01c1c540 100644 --- a/curl_default_function.e +++ b/curl_default_function.e @@ -27,24 +27,19 @@ feature {NONE} -- Initialization feature -- Command progress_function (a_object_id: POINTER; a_download_total, a_download_now, a_upload_total, a_upload_now: REAL_64): INTEGER - -- Redefine do end write_function (a_data_pointer: POINTER; a_size, a_nmemb: INTEGER; a_object_id: POINTER): INTEGER - -- Redefine local l_c_string: C_STRING - l_identified: IDENTIFIED do + -- Returns the number of bytes actually saved into object identified by `a_object_id' Result := a_size * a_nmemb create l_c_string.make_shared_from_pointer_and_count (a_data_pointer, Result) - create l_identified - if attached {CURL_STRING} l_identified.id_object (a_object_id.to_integer_32) as l_string then - l_string.append (l_c_string.string) - else - check False end + check attached {CURL_STRING} (create {IDENTIFIED}).id_object (a_object_id.to_integer_32) as l_string then + l_string.append (l_c_string.substring (1, Result)) end end @@ -54,7 +49,6 @@ feature -- Command end debug_function (a_curl_handle: POINTER; a_curl_infotype: INTEGER; a_char_pointer: POINTER; a_size: INTEGER; a_object_id: POINTER): INTEGER - -- Redefine local l_c_string: C_STRING do @@ -97,11 +91,11 @@ feature {NONE} -- Implementation note library: "cURL: Library of reusable components for Eiffel." - copyright: "Copyright (c) 1984-2006, Eiffel Software and others" + copyright: "Copyright (c) 1984-2012, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software - 356 Storke Road, Goleta, CA 93117 USA + 5949 Hollister Ave., Goleta, CA 93117 USA Telephone 805-685-1006, Fax 805-685-6869 Website http://www.eiffel.com Customer support http://support.eiffel.com diff --git a/curl_function.e b/curl_function.e index 4d61bdc8..f5790214 100644 --- a/curl_function.e +++ b/curl_function.e @@ -8,7 +8,9 @@ note Note: descendants of this class have to call `set_object_and_function_address', otherwise cURL would not know how to call Eiffel features (such as `write_function'). See example: $ISE_LIBRARY\examples\cURL\upload_and_read_function - ]" + + See http://curl.haxx.se/libcurl/c/curl_easy_setopt.html for libcurl documentation + ]" status: "See notice at end of class." legal: "See notice at end of class." date: "$Date$" @@ -116,16 +118,71 @@ feature -- cURL curl_easy_setopt functions end write_function (a_data_pointer: POINTER; a_size, a_nmemb: INTEGER; a_object_id: POINTER): INTEGER - -- Function correspond to {CURL_OPT_CONSTANTS}.curlopt_writefunction + -- Function called by libcurl as soon as there is data received that needs to be saved. + -- The size of the data pointed to by `a_data_pointer' is `a_size' multiplied with `a_nmemb', it will not be null terminated. + -- Returns the number of bytes actually taken care of + -- + -- Function corresponds to {CURL_OPT_CONSTANTS}.curlopt_writefunction -- Note, pass a {IDENTIFIED}.object_id as `a_object_id' value is helpful since we can't directly pass an Eiffel Object address which -- may changed during GC. + --| libcurl doc: + --| Function pointer that should match the following prototype: size_t function( char *ptr, size_t size, size_t nmemb, void *userdata); + --| This function gets called by libcurl as soon as there is data received that needs to be saved. + --| The size of the data pointed to by ptr is size multiplied with nmemb, it will not be zero terminated. + --| Return the number of bytes actually taken care of. + --| If that amount differs from the amount passed to your function, it'll signal an error to the library. + --| This will abort the transfer and return CURLE_WRITE_ERROR. + --| From 7.18.0, the function can return CURL_WRITEFUNC_PAUSE which then will cause writing to this connection to become paused. + --| See curl_easy_pause(3) for further details. + --| + --| This function may be called with zero bytes data if the transferred file is empty. + --| + --| Set this option to NULL to get the internal default function. + --| The internal default function will write the data to the FILE * given with CURLOPT_WRITEDATA. + --| + --| Set the userdata argument with the CURLOPT_WRITEDATA option. + --| + --| The callback function will be passed as much data as possible in all invokes, + --| but you cannot possibly make any assumptions. It may be one byte, it may be thousands. + --| The maximum amount of body data that can be passed to the write callback is defined + --| in the curl.h header file: CURL_MAX_WRITE_SIZE (the usual default is 16K). + --| If you however have CURLOPT_HEADER set, which sends header data to the write callback, + --| you can get up to CURL_MAX_HTTP_HEADER bytes of header data passed into it. This usually means 100K. deferred end read_function (a_data_pointer: POINTER; a_size, a_nmemb: INTEGER; a_object_id: POINTER): INTEGER - -- Function correspond to {CURL_OPT_CONSTANTS}.curlopt_readfunction + -- Function called by libcurl as soon as it needs to read data in order to send it to the peer. + -- The data area pointed at by the pointer `a_data_pointer' may be filled with at most + -- `a_size' multiplied with `a_nmemb' number of bytes. + -- Returns the actual number of bytes stored in that memory area. + -- Returning 0 will signal end-of-file to the library and cause it to stop the current transfer. + -- + -- Function corresponds to {CURL_OPT_CONSTANTS}.curlopt_readfunction -- Note, pass a {IDENTIFIED}.object_id as `a_object_id' value is helpful since we can't directly pass an Eiffel Object address which -- may changed during GC. + --| libcurl doc: + --| Function pointer that should match the following prototype: size_t function( void *ptr, size_t size, size_t nmemb, void *userdata); + --| This function gets called by libcurl as soon as it needs to read data in order to send it to the peer. + --| The data area pointed at by the pointer ptr may be filled with at most size multiplied with nmemb number of bytes. + --| Your function must return the actual number of bytes that you stored in that memory area. + --| Returning 0 will signal end-of-file to the library and cause it to stop the current transfer. + --| + --| If you stop the current transfer by returning 0 "pre-maturely" (i.e before the server expected it, + --| like when you've said you will upload N bytes and you upload less than N bytes), + --| you may experience that the server "hangs" waiting for the rest of the data that won't come. + --| + --| The read callback may return CURL_READFUNC_ABORT to stop the current operation immediately, + --| resulting in a CURLE_ABORTED_BY_CALLBACK error code from the transfer (Added in 7.12.1) + --| + --| From 7.18.0, the function can return CURL_READFUNC_PAUSE which then will cause reading from this connection to become paused. + --| See curl_easy_pause(3) for further details. + --| + --| Bugs: when doing TFTP uploads, you must return the exact amount of data that the callback wants, + --| or it will be considered the final packet by the server end and the transfer will end there. + --| + --| If you set this callback pointer to NULL, or don't set it at all, the default internal read function will be used. + --| It is doing an fread() on the FILE * userdata set with CURLOPT_READDATA. deferred end @@ -187,7 +244,7 @@ feature {NONE} -- Implementation note library: "cURL: Library of reusable components for Eiffel." - copyright: "Copyright (c) 1984-2009, Eiffel Software and others" + copyright: "Copyright (c) 1984-2012, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software