Libcurl und mehrere Objekte



  • Angenommen habe ich eine Klasse, in der libcurl verwendet wird um eine Datei aus dem Netz zu laden. Dann muss ich eine Callback angeben:

    Frame* g_mainframe = NULL;
    
    size_t my_curl_write( void *ptr, size_t size, size_t nmemb, void *stream)
    {
    	if ( g_mainframe != NULL )
    	{
    		string b((char*)ptr);
    		g_mainframe->TellVersion(b);
    		return size*nmemb;
    	}
    	return size*nmemb;;
    }
    
    Frame::Frame()
    {
       g_mainframe = this;
    }
    
    void Frame::GetHttp()
    {
    	CURL* curl = curl_easy_init();
    	curl_easy_setopt(curl, CURLOPT_URL, "http:/google.de");
    	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_curl_write);
    	if ( curl_easy_perform(curl) != CURLE_OK ) 
    	{
    		//Böse
    	}
    	curl_easy_cleanup(curl);
    }
    

    So habe ich es gelöst, da Frame nur 1x existiert, geht es immer an die richtige Adresse. Nur.. wie würde ich das lösen wenn es Frame mehrfach geben würde? Kann man curl iwie nen Zeiger übergeben auf die Instanz?
    lg



  • Was meinst du damit, dass Frame mehrfach existieren kann?

    Ja, man kann der Callback einen Parameter übergeben.

    // [...]
    int x = 100;
    
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_curl_write);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &x);
    // [...]
    
    size_t my_curl_write( void *ptr, size_t size, size_t nmemb, void  *stream)
    {
     int x = (int) stream;
     // [...]
    }
    


  • Oh, mein Cast ist natürlich falsch, es ist ein int * und kein int. Aber du solltest das Prinzip verstanden haben.



  • ooooooooo schrieb:

    Oh, mein Cast ist natürlich falsch, es ist ein int * und kein int. Aber du solltest das Prinzip verstanden haben.

    Ja, hab ich. Vielen Dank. Dann übergeb ich da einfach einen Klassenzeiger.
    lg



  • das ist aber arg unsauber eine downloadfunktionalität so stark mit der gui zu koppeln^^


Anmelden zum Antworten