LINUX.ORG.RU

[Qt][Архитектура] Как лучше?

 ,


0

2

Добрый вечер.
Нуждаюсь в помощи/разъяснении, как реализовать один момент с помощью сигналов/слотов. Итак, имеется одна функция авторизации на сайте. В присоедененном слоте сохраняется статус авторизации, время авторизации (для контроля за сессией), html код и соответственно сама сессия кукой.
Так же, должно быть N функций, которые парсят данные доступные авторизованным пользователям, но предварительно проверяя, не просрочилась ли сессия и производя пере-авторизацию в случае просрочки. Получается что-то наподобие
Загвоздка в строках 44-45. Как сделать правильное ожидание окончания авторизации? Если использовать такой вариант, я не смогу понять, когда закончилась авторизация и какой ее статус (если авторизация зафейлится - парсить не нужно). В идеале должно быть так: если сессия истекла, вызывается функция авторизации, после чего функция парсинга вызывается вновь.
Есть вариант грязного хака с eventloop или постоянное соединение/отсоединение дополнительного слота, но это уныло.
Что посоветуете? Спасибо.

Что-то я не вкурил про окончание авторизации. Поподробней, пожалуйста.

Chaser_Andrey ★★★★★
()

А просто пробовать граббить результаты и попутно проверяя возвращаемый статус? Если сервер просит вновь авторизацию - провести её. Что будет, если комп с твоей программой уйдет в спящий режим? Или время немного поменяется (синхронизируется)? Или внезапно сервер принудительно грохнет сессии (на ЛОРе было такое ведь)? Всё равно нужно перепроверять статус.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Проверку сессии через время делал в качестве примера. Переделал так. Если раскомментировать строку 53 и сразу после неё заново вызывать метод grabIt() - я так понимаю, ответ от сервера может задержаться и grabIt() будет вызван раньше, чем закончится авторизация. Тем более, если авторизация не пройдет (вдруг сервер на профилактике), то вызывать метод парсинга нет смысла.
Я видимо что-то недопонимаю, как лучше организовать этот момент? Можно использовать qeventloop, чтобы дождаться сигнала о завершении авторизации прямо в методе, но наверное можно сделать лучшим образом.

Debianovod2
() автор топика
Ответ на: комментарий от trex6

Они-то и мешают в моем случае. Но использовать qnetworkmanager синхронно, как я понимаю, можно только с помощью костыля QEventLoop.
Нашел интересный топик на qtcentre, где описывается в точности то, что мне нужно (Линк)
Ниже дан ответ, как реализовать это асинхронно.
Насколько я понимаю, предлагается создать дополнительную enum переменную, по которой в методе авторизации будет определяться, какой метод парсинга вызывать и вызывать ли его вообще. Так? Или нет?
Помогите разобраться, пожалуйста :)

Debianovod2
() автор топика
Ответ на: комментарий от Debianovod2

Может быть я не все правильно понял, но пока что вижу ситуацию так:
1. QNetworkAccessManager - отвечает за скачивание данных с сервера.
2. Есть функции, которые скачанную инфу парсят.

Функции начинают парсить кодга приходит информация? Информация накапливается в некотором буфере?

Если все так, тогда при просрочке сессии (ты ведь проверяешь это только в начале ф-ии?) тебе нужно запросить новую авторизацию, сохранить данные в буфер и завершить функцию.
Как только авторизация будет законченна - снова запустить функцию для данных из буфера.

Я правильно все понял?

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Да, все именно так.
Мне главное понять, как правильнее организовать повторный вызов определенной функции парсинга после авторизации.
А в целом, описание 1 в 1 того, что мне нужно с qtcentre:

A system can issue requests to services X, Y, and Z over the network at user request. If this is the first time in a program run that an operation is requested then the system must first request a «login» (L) of the user with the service provider before completing the operation X, Y, or Z. L must complete entirely before operation X, Y, or Z is continued because a cookie returned by L must be available during X, Y, or Z. If the operation X, Y, or Z fails because the cookie has expired or been otherwise rejected by the service provider (perhaps they reboot a server) then the L process must be completed followed by a repeated X, Y, or Z.

Debianovod2
() автор топика
Ответ на: комментарий от trex6

upd: Все верно за исключением того, что каждая функция парсит свою собственную страницу, буфер нужен только для одной, парсящей главную страницу. Остальные парсят определенные вложенные страницы, так же проверяя в начале авторизацию и производя ее при необходимости. Ну не важно, в принципе, все по тому же принципу.

Debianovod2
() автор топика
Ответ на: комментарий от Debianovod2

Собственно вот схема:
Функции прицепленны к сигналу «закончена авторизация».
По этому сигналу они просыпаются, проверяют наличие сесси.
Если есть сессия - парсим свою страничку.
Если нет сессии - заказываем сессию и завершаемся.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Я бы сделал именно так, но:
1. Каждая функция должна парсить свою страницу, разными регулярками. Пример одной из них (ей не нужен буфер, она получает вложенную страницу) http://paste.org.ru/?qcqjww
2. Каждая функция вызывается переодически и по отдельности. Какие функции будут вызываться зависит только от юзера.
3. Непозволительно, чтобы после каждой авторизации постоянно вызывались все фукнции или даже одна из них (по причине 2).

Debianovod2
() автор топика
Ответ на: комментарий от Debianovod2

Тогда есть такой варинт: завести хранилище отложенных функций. Если нет авторизации - добавить эту функцию в хранилище. Как только авторизация прошла - выполнить все отложенные функции.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Например контейнер с указателями на функции?
Вообще, все решится если сделать функцию авторизации через какой-либо блокирующий http клиент (libcurl или собственный класс от qtcpsocket), и возвращающей статус авторизации. Возможно так действительно будет лучше?

Debianovod2
() автор топика
Ответ на: комментарий от Debianovod2

Не, не, не. Никаких указателей. Функций ведь ограниченное количествои и их не много? Тогда просто завести массив булевых переменных.

trex6 ★★★★★
()
Ответ на: комментарий от Debianovod2

Не факт, что это особенно элегантное решение, но я рад, что оно вам подошло.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.