Am 05.11.2011 09:38, schrieb Maxim Fomin:
Hello. I use curl library and need to overwrite default behavior of
data/headers writing.
I use

    curl_easy_setopt(curl, CurlOption.headerfunction,&header_func);
    curl_easy_setopt(curl, CurlOption.writeheader,&this);

where "this" is a class Inet instance, and header_func is a static
function of the class
(should be a callback of fwrite() args semantics). The class has
buffer for header_func
which should copy data from char *ptr to the buffer.
In
    private static size_t header_func(char *ptr, size_t size, size_t
nmemb, void *userdata)
object is casted back:
    Inet *net = cast(Inet*)userdata;
However, I receive segfault at the beginning of header_func().
I don't know how dmd compiler treats object references.
I tried to pass just "this" (without taking address) and cast without
* and all 4 combinations
of&this/this, cast(Inet*)/cast(Inet); none of them works (segfault on
access to Inet class).

So, how can I pass an object through void* or may be there is another
way to tell
header_func() which object should be used?

Thanks.

P.S. D is a nice language, it's a pleasant to work with)

If you cast the void* to a INet when recieving it you should also cast it to a INet when passing it to curl. Pointers to classes point at the same address as any parent class they inherit from. Interfaces however might point into the middle of a class, thus the address of a interface reference is different then the address of a class reference. Classes and interfaces are references types in D so there is no need to use the address operator.

Correct would be something like:

INet callback = this;
curl_easy_setopt(curl, CurlOption.headerfunction, &header_func);
curl_easy_setopt(curl, CurlOption.writeheader, callback);

...

void header_func(...)
{
 INet callback = cast(INet)userdata;
 ...
}

--
Kind Regards
Benjamin Thaut

Reply via email to