You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/kopete/protocols/jabber/ui/dlgjabberservices.cpp

238 lines
6.4 KiB

/***************************************************************************
dlgjabberservices.cpp - Service browsing
-------------------
begin : Mon Dec 9 2002
copyright : (C) 2002-2003 by Till Gerken <till@tantalo.net>
email : kopete-devel@kde.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <kmessagebox.h>
#include <klocale.h>
#include <kdebug.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qtable.h>
#include "jabberaccount.h"
#include "jabberclient.h"
#include "dlgjabberregister.h"
#include "dlgjabberbrowse.h"
#include "dlgjabberservices.h"
#include "dlgjabberservices.moc"
dlgJabberServices::dlgJabberServices (JabberAccount *account, QWidget *parent, const char *name):dlgServices (parent, name)
{
m_account = account;
if(m_account->isConnected())
{
// pre-populate the server field
leServer->setText(m_account->server());
}
// disable the left margin
//tblServices->setLeftMargin (0);
// no content for now
//tblServices->setNumRows (0);
// disable the buttons as long as nothing has been selected
btnRegister->setDisabled (true);
btnBrowse->setDisabled (true);
// allow autostretching
//tblServices->setColumnStretchable (0, true);
//tblServices->setColumnStretchable (1, true);
// disable user selections
//tblServices->setSelectionMode (QTable::NoSelection);
// name table headers
//tblServices->horizontalHeader ()->setLabel (0, i18n ("Name"));
//tblServices->horizontalHeader ()->setLabel (1, i18n ("Address"));
connect (btnQuery, SIGNAL (clicked ()), this, SLOT (slotDisco ()));
//connect (tblServices, SIGNAL (clicked (int, int, int, const QPoint &)), this, SLOT (slotSetSelection (int, int, int, const QPoint &)));
connect (lvServices, SIGNAL (selectionChanged (QListViewItem *)), this, SLOT (slotSetSelection (QListViewItem *)));
connect (btnRegister, SIGNAL (clicked ()), this, SLOT (slotRegister ()));
connect (btnBrowse, SIGNAL (clicked ()), this, SLOT (slotBrowse ()));
}
void dlgJabberServices::slotSetSelection (QListViewItem *it)
{
dlgJabberServies_item *item=dynamic_cast<dlgJabberServies_item*>(it);
if(!item)
{
btnRegister->setDisabled (true);
btnBrowse->setDisabled (true);
}
else
{
btnRegister->setDisabled (! item->can_register);
btnBrowse->setDisabled (! item->can_browse);
current_jid=item->jid;
}
}
void dlgJabberServices::slotService ()
{
if(!m_account->isConnected())
{
m_account->errorConnectFirst();
return;
}
XMPP::JT_GetServices *serviceTask = new XMPP::JT_GetServices (m_account->client()->rootTask ());
connect (serviceTask, SIGNAL (finished ()), this, SLOT (slotServiceFinished ()));
/* populate server field if it is empty */
if(leServer->text().isEmpty())
leServer->setText(m_account->server());
kdDebug (14130) << "[dlgJabberServices] Trying to fetch a list of services at " << leServer->text () << endl;
serviceTask->get (leServer->text ());
serviceTask->go (true);
}
void dlgJabberServices::slotServiceFinished ()
{
kdDebug (14130) << "[dlgJabberServices] Query task finished" << endl;
XMPP::JT_GetServices * task = (XMPP::JT_GetServices *) sender ();
if (!task->success ())
{
QString error = task->statusString();
KMessageBox::queuedMessageBox (this, KMessageBox::Error, i18n ("Unable to retrieve the list of services.\nReason: %1").arg(error), i18n ("Jabber Error"));
return;
}
lvServices->clear();
for (XMPP::AgentList::const_iterator it = task->agents ().begin (); it != task->agents ().end (); ++it)
{
dlgJabberServies_item *item=new dlgJabberServies_item( lvServices , (*it).jid ().userHost () , (*it).name ());
item->jid=(*it).jid();
item->can_browse=(*it).features().canSearch();
item->can_register=(*it).features().canRegister();
}
}
void dlgJabberServices::slotDisco()
{
lvServices->clear();
if(!m_account->isConnected())
{
m_account->errorConnectFirst();
return;
}
JT_DiscoItems *jt = new JT_DiscoItems(m_account->client()->rootTask());
connect(jt, SIGNAL(finished()), this, SLOT(slotDiscoFinished()));
/* populate server field if it is empty */
if(leServer->text().isEmpty())
leServer->setText(m_account->server());
jt->get(leServer->text() , QString());
jt->go(true);
}
void dlgJabberServices::slotDiscoFinished( )
{
XMPP::JT_DiscoItems *jt = (JT_DiscoItems *)sender();
if ( jt->success() )
{
QValueList<XMPP::DiscoItem> list = jt->items();
lvServices->clear();
for(QValueList<XMPP::DiscoItem>::ConstIterator it = list.begin(); it != list.end(); ++it)
{
const XMPP::DiscoItem a = *it;
dlgJabberServies_item *item=new dlgJabberServies_item( lvServices , (*it).jid ().userHost () , (*it).name ());
item->jid=a.jid();
item->updateInfo(a.jid() , a.node(), m_account);
}
}
else
{
slotService();
}
}
void dlgJabberServices::slotRegister ()
{
dlgJabberRegister *registerDialog = new dlgJabberRegister (m_account, current_jid);
registerDialog->show ();
registerDialog->raise ();
}
void dlgJabberServices::slotBrowse ()
{
dlgJabberBrowse *browseDialog = new dlgJabberBrowse (m_account, current_jid);
browseDialog->show ();
browseDialog->raise ();
}
dlgJabberServices::~dlgJabberServices ()
{
}
void dlgJabberServies_item::updateInfo( const XMPP::Jid & jid , const QString & node , JabberAccount *account )
{
XMPP::JT_DiscoInfo *jt = new XMPP::JT_DiscoInfo(account->client()->rootTask());
connect(jt, SIGNAL(finished()),this, SLOT(slotDiscoFinished()));
jt->get(jid, node);
jt->go(true);
}
void dlgJabberServies_item::slotDiscoFinished( )
{
JT_DiscoInfo *jt = (JT_DiscoInfo *)sender();
if ( jt->success() )
{
can_browse = jt->item().features().canSearch();
can_register = jt->item().features().canRegister();
}
else
{
//TODO: error message (it's a simple message box to show)
}
}