Написание собственного jabber бота на C++ : gloox::ConnectionListener =)




Так, к серверу мы подключаемся, но к сожалению мы в данный момент не можем :
1. Узнать подключились мы или нет ?
2. Корректно завершить работу, ибо один единственный поток занимает client->connect();
Поможет нам в этом класс, которого оповещает gloox::Client об подключении/отключении. Зовется он ConnectionListener. Задумка библиотеки такова, что этот класс абстрактен, поэтому нам просто необходимо унаследовать от него свой класс и переназначить все виртуальные методы. А их у него всего три :
virtual void onConnect(); virtual void onDisconnect( gloox::ConnectionError e ); virtual bool onTLSConnect( const gloox::CertInfo& );
Сейчас исправим нашего ботика таким образом, чтобы :
1. Он подключался
2. При удачно соединении сообщал нам об этом.
3. При неудачи срал кирпичами сообщал нам об этом.
4. После подключения ждал 5 секунд и отключался.
Цели ясны, приступим исправлять исходник, для начала подключим следующие заголовочные файлы:
#include <gloox/client.h> #include <gloox/connectionlistener.h>
С первыми двумя всё ясно, ну а третий будет использоваться для обьявления функции unsigned int sleep( unsigned int sec );.
Продолжаем, исправим немного наш класс, унаследуем его от gloox::ConnectionListener и добавим те самые три виртуальных метода:
class Bot : public gloox::ConnectionListener{ public: Bot(); ~Bot(); void Connect(); protected: virtual void onConnect(); virtual void onDisconnect( gloox::ConnectionError e ); virtual bool onTLSConnect( const gloox::CertInfo& ); gloox::Client *client; };
Теперь, добавим в конструктор класса Bot следующую строчку, суть которой я думаю яснее ясного :
client->registerConnectionListener( this );
А дальше по новым методам :

void onConnect(){ // сообщили, об удачном соединении std::cout << "Соеденилисьn"; // подождали sleep( 5 ); // отключились client->disconnect(); } void Bot::onDisconnect( gloox::ConnectionError e ){ // сообщаем о дисконнекте std::cout << "Дисконнектn EROOR : " << e << 'n'; } bool Bot::onTLSConnect( const gloox::CertInfo& ){ // оно нам не нужно для порабощения голактики }
Ну вот в общем-то и всё.


Рубрика Linux, Без рубрики