2010-11-19 13 views
8
class Filter{ 
private: 
    string contents; 
    bool Server(void); 
public: 
    void handle(void *, size_t, size_t, void *); 
    }; 

tengo un encabezado de clase como este. Quiero llamar a curl WRITEFUNCTION dentro de la función Servidor que usaría el controlador para escribir en el contenido de la cadena. aunque me mantiene giveng el errorcurl WRITEFUNCTION y clases

error: invalid use of member (did you forget the ‘&’ ?) 

la línea apuntada por error es el de CURLOPT_WRITEFUNCTION .... Mi solicitud de rizo se ve algo como esto ...

curl_easy_setopt(curl,CURLOPT_URL, address.c_str()); 
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle); 
curl_easy_perform(curl); 

que significa que es incapaz de acceda al controlador() .. ¿cómo puedo rectificar esto?

Respuesta

2
string temp; 

curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle); 
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&temp); 

size_t Filter::handle(void *ptr, size_t size, size_t nmemb, string stream) 
{ 
    string temp(static_cast<const char*>(ptr), size * nmemb); 
    stream = temp; 
    return size*nmemb; 
} 

eso es cómo lo tengo que trabajar .. Esto ahorrará el sitio web de la cadena denominada temp.

+1

Esto crea una temperatura std :: string local donde se almacenan los datos. Luego, la temperatura se copia a la secuencia del argumento. Cuando la función vuelva a aparecer, ambas cadenas se eliminarán. Use temp.append (...) en su lugar, para escribir datos en la temperatura de cadena global. O use la firma correcta con un puntero a la cadena global y añada la llamada a través de este puntero. – hansmaad

+0

Debe usar append porque la función de escritura podría invocarse varias veces para un recurso que # recargar – hansmaad

+0

que se bloquea en mí – Tim

16

El asa debe ser una función de miembro estático. Puede pasar un puntero a la instancia de filtro como último argumento mediante el uso de CURLOPT_WRITEDATA

class Filter 
{ 
private: 
    std::string content_; 
    static size_t handle(char * data, size_t size, size_t nmemb, void * p); 
    size_t handle_impl(char * data, size_t size, size_t nmemb); 
}; 

size_t Filter::handle(char * data, size_t size, size_t nmemb, void * p) 
{ 
    return static_cast<Filter*>(p)->handle_impl(data, size, nmemb); 
} 

size_t Filter::handle_impl(char* data, size_t size, size_t nmemb) 
{ 
    content_.append(data, size * nmemb); 
    return size * nmemb; 
} 

int main() 
{ 
    // curl initialization... should be done in a constructor 
    Filter f; 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &f); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Filter::handle); 
    // curl cleanup... should be done in a destructor 
    return 0; 
} 
+0

¿hay alguna otra manera que crear una instancia? –

+1

Si desea escribir en std :: string Filter :: contents, necesita una instancia. Si desea escribir en un búfer de contenido global, puede usar el método de manejo estático o una función de manejo libre. – hansmaad

+1

+1, este es el camino a seguir. @Prasanth Madhavan, a la cual 'Filter' would' handle' write si no creaste una instancia? –

1

estoy usando curlpp:

std::stringstream result; 

request.setOpt(cURLpp::Options::WriteStream(&result)); 
request.perform(); 

esto ahorrará el servidor web respuesta al resultado llamado stringstream.