Russian Qt Forum

Qt => Работа с сетью => Тема начата: aRise от Июнь 24, 2013, 12:32



Название: libcurl callback внутри класса QObject
Отправлено: aRise от Июнь 24, 2013, 12:32
Подскажите плиз куда копать :(
Пишу http-клиент.
после долгих безрезультатных попыток раскачегарить QNetworkAccessManager, решено было перейти к использованию libcurl
для отправки POST запроса на сервер использую колбэк курвы.
при использовании колбэка "голяком" вне класса, он работает замечательно, но когда затаскиваю колбэк внутрь QObject класса, при его вызове в параметрах галиматья откровенная.
в ptr вместо ссылки на буффер, значение 1. соответственно и прочитать в буфер не удается.

куски кода:
Код:

class httpupload : public QObject
{
    Q_OBJECT
public:
    explicit httpupload(QObject *parent = 0);
    void uploadfile(QString filename);
    size_t curl_write(void *ptr, size_t size, size_t nmemb, void *userdata);
    CURL *curl;
    FILE* file;
signals:   
public slots:
};
в исходнике:
Код:
size_t httpupload::curl_write(void *ptr, size_t size, size_t nmemb, void* userdata){
    size_t retcode = fread((char*)ptr, buffsize, 1, file);
    return retcode;
}

void httpupload::uploadfile(QString filename){
    curl = curl_easy_init();
....
     file = fopen(filename.toAscii().data(), "rb");
   if(curl) {
      curl_easy_setopt(curl, CURLOPT_URL, uploadurl.toAscii().data());
      curl_easy_setopt(curl, CURLOPT_POST, 1);
      curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE,outsegment);
      curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)outsegment);
      curl_easy_setopt(curl, CURLOPT_READDATA, file);
      curl_easy_setopt(curl, CURLOPT_READFUNCTION, &httpupload::curl_write);
      res = curl_easy_perform(curl);
      if(res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));

      };
    curl_easy_cleanup(curl);
  };
}


Название: Re: libcurl callback внутри класса QObject
Отправлено: Bepec от Июнь 24, 2013, 12:46
Вы надеюсь в курсе различия между функцией и методом класса?

Чтобы вызвать метод, нужен объект класса.
 И кстати с моими знаниями - вообще удивительно, что оно у вас не падает в *****.


Название: Re: libcurl callback внутри класса QObject
Отправлено: kambala от Июнь 24, 2013, 12:52
со статическим методом коллбэк будет работать.

а зачем вообще наследоваться от QObject? планируешь сигналы рассылать?


Название: Re: libcurl callback внутри класса QObject
Отправлено: aRise от Июнь 24, 2013, 13:15
да, дальше будут рассылаться сигналы.
http клиент это только маленькая часть программы.
поковырял в отладчике.
пришла в голову мысль что при компиляции, у метода класса меняется модель вызова (__stdcall,__cdecl...)
 потому как параметры вроде как похожи, но порядок их передачи другой.
попробую все 4 параметра задать тип uint и сравнить

UPD:
похоже что отбой тревоги. проблема не в коде. дома на Qt5.0.2+MinGW4.7 работает. на работе Qt4.8 пересобранная на сто рядов и MinGW старый вручную прикрученный.