Russian Qt Forum
Ноябрь 23, 2024, 08:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: libcurl callback внутри класса QObject  (Прочитано 3456 раз)
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);
  };
}
Записан
Bepec
Гость
« Ответ #1 : Июнь 24, 2013, 12:46 »

Вы надеюсь в курсе различия между функцией и методом класса?

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Июнь 24, 2013, 12:52 »

со статическим методом коллбэк будет работать.

а зачем вообще наследоваться от QObject? планируешь сигналы рассылать?
« Последнее редактирование: Июнь 24, 2013, 12:56 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
aRise
Гость
« Ответ #3 : Июнь 24, 2013, 13:15 »

да, дальше будут рассылаться сигналы.
http клиент это только маленькая часть программы.
поковырял в отладчике.
пришла в голову мысль что при компиляции, у метода класса меняется модель вызова (__stdcall,__cdecl...)
 потому как параметры вроде как похожи, но порядок их передачи другой.
попробую все 4 параметра задать тип uint и сравнить

UPD:
похоже что отбой тревоги. проблема не в коде. дома на Qt5.0.2+MinGW4.7 работает. на работе Qt4.8 пересобранная на сто рядов и MinGW старый вручную прикрученный.
« Последнее редактирование: Июнь 24, 2013, 15:11 от aRise » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.