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.
979 lines
27 KiB
979 lines
27 KiB
/**********************************************************************
|
|
|
|
Server Controller
|
|
|
|
$$Id$$
|
|
|
|
Main Server Controller. Displays server connection window, and makes
|
|
new server connection on demand.
|
|
|
|
Signals: NONE
|
|
|
|
Slots:
|
|
|
|
new_connection(): Creates popup asking for new connection
|
|
|
|
new_ksircprocess(QString):
|
|
Args:
|
|
QString: new server name or IP to connect to.
|
|
Action:
|
|
Creates a new sirc process and window !default connected to the
|
|
server. Does nothing if a server connection already exists.
|
|
|
|
add_toplevel(QString parent, QString child):
|
|
Args:
|
|
parent: the server name that the new channel is being joined on
|
|
child: the new channel name
|
|
Action:
|
|
Adds "child" to the list of joined channles in the main
|
|
window. Always call this on new window creation!
|
|
|
|
delete_toplevel(QString parent, QString child):
|
|
Args:
|
|
parent: the server name of which channel is closing
|
|
child: the channle that is closing. IFF Emtpy, parent is
|
|
deleted.
|
|
Action:
|
|
Deletes the "child" window from the list of connections. If
|
|
the child is Empty the whole tree is removed since it is assumed
|
|
the parent has disconnected and is closing.
|
|
|
|
new_channel: Creates popup asking for new channel name
|
|
|
|
new_toplevel(QString str):
|
|
Args:
|
|
str: name of the new channel to be created
|
|
Action:
|
|
Sends a signal to the currently selected server in the tree
|
|
list and join the requested channel. Does nothing if nothing
|
|
is selected in the tree list.
|
|
|
|
recvChangeChanel(QString parent, QString old, QString new):
|
|
Args:
|
|
parent: parent server connection
|
|
old: the old name for the window
|
|
new: the new name for the window
|
|
Action:
|
|
Changes the old window name to the new window name in the tree
|
|
list box. Call for all name change!
|
|
|
|
*********************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
#include "servercontroller.h"
|
|
#include "KSOpenkSirc/open_ksirc.h"
|
|
#include "NewWindowDialog.h"
|
|
#include "ksopts.h"
|
|
#include "control_message.h"
|
|
#include "FilterRuleEditor.h"
|
|
#include "../config.h"
|
|
#include "version.h"
|
|
#include "KSPrefs/ksprefs.h"
|
|
#include "toplevel.h"
|
|
#include "ksircserver.h"
|
|
#include "nickColourMaker.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "objFinder.h"
|
|
#include <qlabel.h>
|
|
#include <qregexp.h>
|
|
|
|
#include <kmenubar.h>
|
|
#include <kconfig.h>
|
|
#include <kfontdialog.h>
|
|
#include <kiconloader.h>
|
|
#include <kwin.h>
|
|
#include <kdebug.h>
|
|
#include <kstdaccel.h>
|
|
#include <kstandarddirs.h>
|
|
#include <khelpmenu.h>
|
|
#include <kstdaction.h>
|
|
#include <kaction.h>
|
|
#include <knotifydialog.h>
|
|
#include <netwm.h>
|
|
#include <kpassivepopup.h>
|
|
#include <kglobalaccel.h>
|
|
#include <kstdguiitem.h>
|
|
|
|
#include <qfile.h>
|
|
|
|
#include "displayMgrSDI.h"
|
|
#include "displayMgrMDI.h"
|
|
|
|
#include "dockservercontroller.h"
|
|
|
|
#ifdef HAVE_PATHS_H
|
|
#include <paths.h>
|
|
#endif
|
|
#include <klocale.h>
|
|
#include <kapplication.h>
|
|
#include <kpopupmenu.h>
|
|
|
|
DisplayMgr *displayMgr;
|
|
|
|
servercontroller *servercontroller::s_self = 0;
|
|
|
|
servercontroller::servercontroller( QWidget*, const char* name )
|
|
: KMainWindow( 0, name )
|
|
{
|
|
we_are_exiting = false;
|
|
m_notificationCount = 0;
|
|
|
|
m_ncm = new nickColourMaker();
|
|
|
|
MenuBar = menuBar();
|
|
KWin::setIcons( winId(), kapp->icon(), kapp->miniIcon() );
|
|
|
|
s_self = this;
|
|
|
|
switch (ksopts->displayMode)
|
|
{
|
|
case KSOptions::SDI:
|
|
displayMgr = new DisplayMgrSDI();
|
|
break;
|
|
case KSOptions::MDI:
|
|
displayMgr = new DisplayMgrMDI();
|
|
break;
|
|
}
|
|
|
|
sci = new scInside(this, QCString(name) + "_mainview");
|
|
setCentralWidget(sci);
|
|
|
|
sci->setFrameStyle(QFrame::Box | QFrame::Raised);
|
|
ConnectionTree = sci->ConnectionTree;
|
|
|
|
connect(ConnectionTree, SIGNAL(clicked( QListViewItem * )),
|
|
this, SLOT(WindowSelected(QListViewItem *)));
|
|
|
|
setFrameBorderWidth(5);
|
|
|
|
QPopupMenu *file = new QPopupMenu(this, QCString(name) + "_menu_file");
|
|
KStdAction::quit(this, SLOT(endksirc()), actionCollection())->plug(file);
|
|
#ifndef NDEBUG
|
|
file->insertItem(i18n("Dump Object Tree"), this, SLOT(dump_obj()));
|
|
file->insertItem(i18n("Server Debug Window"), this, SLOT(server_debug()));
|
|
#endif
|
|
MenuBar->insertItem(i18n("&File"), file);
|
|
|
|
connections = new QPopupMenu(this, QCString(name) + "_menu_connections");
|
|
|
|
server_id = connections->insertItem(i18n("&New Server..."), this, SLOT(new_connection()), Key_F2 );
|
|
join_id = connections->insertItem(i18n("&Join Channel..."), this, SLOT(new_channel()), Key_F3 );
|
|
connections->insertSeparator();
|
|
connections->insertItem(i18n("&Do Autoconnect..."), this, SLOT(start_autoconnect_check()));
|
|
connections->setItemEnabled(join_id, FALSE);
|
|
MenuBar->insertItem(i18n("&Connections"), connections);
|
|
|
|
options = new QPopupMenu(this, QCString(name) + "_menu_options");
|
|
options->setCheckable(TRUE);
|
|
|
|
options->insertItem(SmallIcon( "filter" ), i18n("&Filter Rule Editor..."),
|
|
this, SLOT(filter_rule_editor()));
|
|
options->insertSeparator();
|
|
KStdAction::configureNotifications(this, SLOT(notification_prefs()), actionCollection())->plug(options);
|
|
|
|
KStdAction::preferences(this, SLOT(general_prefs()), actionCollection())->plug(options);
|
|
|
|
MenuBar->insertItem(i18n("&Settings"), options);
|
|
|
|
KHelpMenu *help = new KHelpMenu( this, kapp->aboutData() );
|
|
MenuBar->insertItem( KStdGuiItem::help().text(), help->menu() );
|
|
|
|
m_kga = new KGlobalAccel(this, "globalAccess");
|
|
m_kga->insert("New Server", i18n("New Server"),
|
|
i18n("This action allows you to open a new server more easily "
|
|
"when in docked mode, since you don't need to click on the "
|
|
"dock icon."),
|
|
ALT+CTRL+Key_C, KKey::QtWIN+CTRL+Key_C, this,
|
|
SLOT(new_connection()));
|
|
|
|
open_toplevels = 0;
|
|
|
|
pic_server = UserIcon("server");
|
|
pic_gf = UserIcon("ksirc_a");
|
|
pic_run = UserIcon("mini-run");
|
|
pic_ppl = UserIcon("channels");
|
|
pic_icon = UserIcon("ksirc_b");
|
|
|
|
setCaption( i18n("Server Control") );
|
|
KWin::setIcons(winId(), pic_icon, pic_server);
|
|
|
|
resize( 450,200 );
|
|
|
|
dockWidget = new dockServerController(this, 0x0, "servercontroller_dock");
|
|
KWin::setSystemTrayWindowFor( dockWidget->winId(), winId() );
|
|
|
|
m_kga->readSettings();
|
|
m_kga->updateConnections();
|
|
|
|
checkDocking();
|
|
}
|
|
|
|
|
|
servercontroller::~servercontroller()
|
|
{
|
|
kdDebug(5008) << "~servercontroller in" << endl;
|
|
s_self = 0;
|
|
delete m_ncm;
|
|
kdDebug(5008) << "~servercontroller out" << endl;
|
|
}
|
|
|
|
void servercontroller::checkDocking()
|
|
{
|
|
if(ksopts->runDocked == true){
|
|
dockWidget->show();
|
|
hide();
|
|
m_kga->setEnabled(true);
|
|
}
|
|
else {
|
|
dockWidget->hide();
|
|
show();
|
|
m_kga->setEnabled(false);
|
|
}
|
|
|
|
}
|
|
|
|
void servercontroller::new_connection()
|
|
{
|
|
open_ksirc *w = new open_ksirc(); // Create new ksirc popup
|
|
connect(w, SIGNAL(open_ksircprocess(KSircServer &)), // connected ok to process
|
|
this, SLOT(new_ksircprocess(KSircServer &))); // start
|
|
w->exec(); // show the sucker!
|
|
delete w;
|
|
}
|
|
|
|
void servercontroller::new_ksircprocess(KSircServer &kss)
|
|
{
|
|
QString server_id;
|
|
int id = 1;
|
|
if(kss.server().isEmpty()) // nothing entered, nothing done
|
|
return;
|
|
server_id = kss.server();
|
|
while(proc_list[server_id]){ // if it already exists, quit
|
|
server_id = QString("%1 %2").arg(kss.server()).arg(id++);
|
|
}
|
|
|
|
// Insert new base
|
|
QListViewItem *rootItem = new QListViewItem( ConnectionTree, server_id );
|
|
rootItem->setPixmap( 0, pic_server );
|
|
rootItem->setOpen( true );
|
|
|
|
// We do no_channel here since proc emits the signal in the
|
|
// constructor, and we can't connect to before then, so we have to
|
|
// do the dirty work here.
|
|
ProcMessage(server_id, ProcCommand::addTopLevel, QString("no_channel"));
|
|
|
|
KSircProcess *proc = new KSircProcess(server_id, kss, 0, (QString(name()) + "_" + server_id + "_ksp").ascii() ); // Create proc
|
|
//this->insertChild(proc); // Add it to out inheritance tree so we can retreive child widgets from it.
|
|
objFinder::insert(proc);
|
|
proc_list.insert(server_id, proc); // Add proc to hash
|
|
connect(proc, SIGNAL(ProcMessage(QString, int, QString)),
|
|
this, SLOT(ProcMessage(QString, int, QString)));
|
|
connect(this, SIGNAL(ServMessage(QString, int, QString)),
|
|
proc, SLOT(ServMessage(QString, int, QString)));
|
|
|
|
if(!ConnectionTree->currentItem()){ // If nothing's highlighted
|
|
ConnectionTree->setCurrentItem(rootItem); // highlight it.
|
|
}
|
|
|
|
connections->setItemEnabled(join_id, TRUE);
|
|
|
|
dockWidget->serverOpen(server_id);
|
|
}
|
|
|
|
void servercontroller::new_channel()
|
|
{
|
|
QString server;
|
|
QListViewItem *citem = ConnectionTree->currentItem(); // get item
|
|
if(citem){ // if it exist, ie something is highlighted, continue
|
|
if(proc_list[citem->text(0)]){ // If it's a match with a server, ok
|
|
server = citem->text(0);
|
|
}
|
|
// Otherwise, check the parent to see it's perhaps a server.
|
|
else if ( citem->parent() ) {
|
|
if(proc_list[citem->parent()->text(0)]){
|
|
server = citem->parent()->text(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(server.isEmpty())
|
|
return;
|
|
|
|
KSircChannel ci(server, QString::null);
|
|
NewWindowDialog w(ci);
|
|
connect(&w, SIGNAL(openTopLevel(const KSircChannel &)),
|
|
this, SLOT(new_toplevel(const KSircChannel &)));
|
|
w.exec();
|
|
}
|
|
|
|
void servercontroller::new_toplevel(const KSircChannel &channelInfo)
|
|
{
|
|
new_toplevel(channelInfo, false);
|
|
}
|
|
|
|
void servercontroller::new_toplevel(const KSircChannel &channelInfo, bool safe)
|
|
{
|
|
if(proc_list[channelInfo.server()]){ // If it's a match with a server, ok
|
|
proc_list[channelInfo.server()]->new_toplevel(channelInfo, safe);
|
|
}
|
|
}
|
|
|
|
void servercontroller::ToggleAutoCreate()
|
|
{
|
|
ksopts->autoCreateWin = !ksopts->autoCreateWin;
|
|
}
|
|
|
|
void servercontroller::general_prefs()
|
|
{
|
|
KSPrefs *kp = new KSPrefs();
|
|
connect(kp, SIGNAL(update(int)),
|
|
this, SLOT(configChange()));
|
|
kp->resize(550, 450);
|
|
kp->show();
|
|
}
|
|
|
|
void servercontroller::notification_prefs()
|
|
{
|
|
KNotifyDialog::configure(this, "Notification Configuration Dialog");
|
|
}
|
|
|
|
void servercontroller::dump_obj()
|
|
{
|
|
|
|
objFinder::dumpTree();
|
|
|
|
}
|
|
void servercontroller::server_debug()
|
|
{
|
|
QListViewItem *citem = ConnectionTree->currentItem(); // get item
|
|
if(citem){ // if it exist, ie something is highlighted, continue
|
|
QString server;
|
|
if(proc_list[citem->text(0)]){ // If it's a match with a server, ok
|
|
server = citem->text(0);
|
|
}
|
|
else if ( citem->parent() ) {
|
|
if(proc_list[citem->parent()->text(0)]){
|
|
server = citem->parent()->text(0);
|
|
}
|
|
}
|
|
|
|
if( !server.isNull() ){
|
|
bool sh = proc_list[server]->getIOController()->isDebugTraffic();
|
|
proc_list[server]->getIOController()->showDebugTraffic(!sh);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void servercontroller::filter_rule_editor()
|
|
{
|
|
FilterRuleEditor *fe = new FilterRuleEditor();
|
|
connect(fe, SIGNAL(destroyed()),
|
|
this, SLOT(slot_filters_update()));
|
|
fe->show();
|
|
}
|
|
|
|
void servercontroller::font_update(const QFont &font)
|
|
{
|
|
ksopts->defaultFont = font;
|
|
/* configChange(); */
|
|
|
|
KConfig *kConfig = kapp->config();
|
|
kConfig->setGroup("GlobalOptions");
|
|
kConfig->sync();
|
|
QApplication::setFont( font, true, "KSirc::TextView" );
|
|
}
|
|
|
|
void servercontroller::configChange()
|
|
{
|
|
QDictIterator<KSircProcess> it( proc_list );
|
|
while(it.current()){
|
|
it.current()->filters_update();
|
|
it.current()->getWindowList()["!all"]->control_message(REREAD_CONFIG, "");
|
|
++it;
|
|
}
|
|
m_kga->readSettings();
|
|
m_kga->updateConnections();
|
|
}
|
|
|
|
void servercontroller::ProcMessage(QString server, int command, QString args)
|
|
{
|
|
QListViewItem *serverItem = 0L;
|
|
QListViewItem *item = ConnectionTree->firstChild();
|
|
while ( item ) {
|
|
if ( !item->parent() && item->text(0) == server ) {
|
|
serverItem = item;
|
|
break;
|
|
}
|
|
item = item->nextSibling();
|
|
}
|
|
|
|
if ( !serverItem ) {
|
|
kdDebug(5008) << "* ProcMessage for non-existant server?! - " << server<< endl;
|
|
return;
|
|
}
|
|
|
|
|
|
switch(command){
|
|
|
|
|
|
// Nick offline and online both remove the nick first.
|
|
// We remove the nick in case of an online so that we don't get
|
|
// duplicates.
|
|
// Args == nick comming on/offline.
|
|
case ProcCommand::nickOffline:
|
|
{
|
|
QListViewItem *online_item = findChild(serverItem, i18n("Online"));
|
|
if(online_item){
|
|
item = findChild(online_item, args);
|
|
delete item;
|
|
if(online_item->childCount() == 0)
|
|
delete online_item;
|
|
if(ksopts->runDocked && ksopts->dockPopups)
|
|
KPassivePopup::message(i18n("%1 just went offline on %2").arg(args).arg(server), dockWidget);
|
|
}
|
|
dockWidget->nickOffline(server, args);
|
|
break;
|
|
}
|
|
case ProcCommand::nickOnline:
|
|
{
|
|
QListViewItem *online_item = findChild(serverItem, i18n("Online"));
|
|
if(!online_item){
|
|
online_item = new QListViewItem(serverItem, i18n("Online"));
|
|
online_item->setPixmap( 0, pic_gf );
|
|
online_item->setOpen( true );
|
|
}
|
|
else {
|
|
item = findChild(online_item, args);
|
|
if( item ){
|
|
delete item;
|
|
}
|
|
}
|
|
item = new QListViewItem(online_item, args);
|
|
item->setPixmap( 0, pic_run );
|
|
if(ksopts->runDocked && ksopts->dockPopups)
|
|
KPassivePopup::message(i18n("%1 just came online on %2").arg(args).arg(server), dockWidget);
|
|
dockWidget->nickOnline(server, args);
|
|
break;
|
|
}
|
|
/*
|
|
// Add new channel, first add the parent to the path
|
|
path.push(&server);
|
|
path.push(&online);
|
|
path.push(&args);
|
|
// Remove old one if it's there
|
|
ConnectionTree->removeItem(&path); // Remove the item
|
|
path.pop();
|
|
// add a new child item with parent as its parent
|
|
ConnectionTree->addChildItem(args, pic_run, &path);
|
|
if (kSircConfig->BeepNotify) {
|
|
KNotifyClient::beep();
|
|
}
|
|
break;
|
|
*/
|
|
|
|
/**
|
|
* Args:
|
|
* parent: the server name that the new channel is being joined on
|
|
* child: the new channel name
|
|
* Action:
|
|
* Adds "child" to the list of joined channles in the main
|
|
* window. Always call this on new window creation!
|
|
*/
|
|
case ProcCommand::addTopLevel:
|
|
// Add new channel
|
|
if(args[0] == '!')
|
|
args.remove(0, 1); // If the first char is !, it's control, remove it
|
|
// add a new child item with parent as it's parent
|
|
item = new QListViewItem( serverItem, args );
|
|
item->setPixmap( 0, pic_ppl );
|
|
|
|
open_toplevels++;
|
|
break;
|
|
/**
|
|
* Args:
|
|
* parent: the server name of which channel is closing
|
|
* child: the channle that is closing. IFF Emtpy, parent is
|
|
* deleted.
|
|
* Action:
|
|
* Deletes the "child" window from the list of connections. If
|
|
* the child is Empty the whole tree is removed since it is assumed
|
|
* the parent has disconnected and is closing.
|
|
*/
|
|
case ProcCommand::deleteTopLevel:
|
|
// If the child is emtpy, delete the whole tree, otherwise just the child
|
|
if(args[0] == '!')
|
|
args.remove(0, 1); // If the first char is !, it's control, remove it
|
|
|
|
item = findChild( serverItem, args );
|
|
delete item;
|
|
if ( serverItem->childCount() == 0 )
|
|
delete serverItem;
|
|
|
|
open_toplevels--;
|
|
break;
|
|
|
|
/**
|
|
* Args:
|
|
* parent: parent server connection
|
|
* old: the old name for the window
|
|
* new: the new name for the window
|
|
* Action:
|
|
* Changes the old window name to the new window name in the tree
|
|
* list box. Call for all name change!
|
|
*/
|
|
case ProcCommand::changeChannel:
|
|
{
|
|
char *new_s, *old_s;
|
|
new_s = new char[args.length()+1];
|
|
old_s = new char[args.length()+1];
|
|
sscanf(args.ascii(), "%s %s", old_s, new_s);
|
|
// If the channel has a !, it's a control channel, remove the !
|
|
if(old_s[0] == '!')
|
|
// Even though, we want strlen() -1 characters, strlen doesn't
|
|
// include the \0, so we need to copy one more. -1 + 1 = 0.
|
|
memmove(old_s, old_s+1, strlen(old_s));
|
|
if(new_s[0] == '!')
|
|
memmove(new_s, new_s+1, strlen(new_s)); // See above for strlen()
|
|
|
|
item = findChild( serverItem, old_s );
|
|
delete item;
|
|
item = new QListViewItem( serverItem, new_s );
|
|
item->setPixmap( 0, pic_ppl );
|
|
|
|
delete[] new_s;
|
|
delete[] old_s;
|
|
}
|
|
break;
|
|
case ProcCommand::procClose:
|
|
dockWidget->serverClose(server);
|
|
delete serverItem;
|
|
proc_list.remove(server); // Remove process entry while we are at it
|
|
if(proc_list.count() == 0){
|
|
ConnectionTree->clear();
|
|
connections->setItemEnabled(join_id, FALSE);
|
|
}
|
|
break;
|
|
case ProcCommand::turnOffAutoCreate:
|
|
if (ksopts->autoCreateWin) {
|
|
ToggleAutoCreate();
|
|
}
|
|
break;
|
|
case ProcCommand::turnOnAutoCreate:
|
|
if (!ksopts->autoCreateWin) {
|
|
ToggleAutoCreate();
|
|
}
|
|
break;
|
|
default:
|
|
kdDebug(5008) << "Unkown command: [" << command << "] from "
|
|
<< server
|
|
<< " " << args << endl;
|
|
}
|
|
}
|
|
|
|
void servercontroller::slot_filters_update()
|
|
{
|
|
emit ServMessage(QString(), ServCommand::updateFilters, QString());
|
|
}
|
|
|
|
void servercontroller::saveGlobalProperties(KConfig *ksc)
|
|
{
|
|
// ksc hos the K Session config
|
|
// ksp == current KSircProcess
|
|
// ksm == current KSircMessageReceiver
|
|
|
|
// Ignore all !<name> windows
|
|
|
|
QString group = ksc->group();
|
|
|
|
ksc->setGroup( "KSircSession" );
|
|
SessionConfigMap::ConstIterator it = m_sessionConfig.begin();
|
|
for (; it != m_sessionConfig.end(); ++it ) {
|
|
|
|
ChannelSessionInfoList infoList = *it;
|
|
|
|
QStringList channels;
|
|
QString port = "6667";
|
|
QStringList desktops;
|
|
|
|
for ( ChannelSessionInfoList::ConstIterator sessionInfoIt = infoList.begin();
|
|
sessionInfoIt != infoList.end(); ++sessionInfoIt ) {
|
|
channels << ( *sessionInfoIt ).name;
|
|
port = ( *sessionInfoIt ).port;
|
|
desktops << QString::number( ( *sessionInfoIt ).desktop );
|
|
}
|
|
|
|
KConfigGroup( ksc, "KSircSession" ).writeEntry( it.key(), channels );
|
|
KConfigGroup( ksc, "KSircSessionPort" ).writeEntry( it.key(), port );
|
|
KConfigGroup( ksc, "KSircSessionDesktopNumbers" ).writeEntry( it.key(), desktops );
|
|
}
|
|
|
|
ksc->setGroup("ServerController");
|
|
// ksc->writeEntry("Docked", !isVisible());
|
|
ksc->writeEntry("Size", geometry());
|
|
ksc->setGroup(group);
|
|
}
|
|
|
|
void servercontroller::readGlobalProperties(KConfig *ksc)
|
|
{
|
|
QString group = ksc->group();
|
|
|
|
// ksc == K Session Config
|
|
|
|
// KMainWindow silently disables our menubar, when we quit in a docked
|
|
// state, so we have to force showing it here.
|
|
menuBar()->show();
|
|
|
|
// commented in for testing...
|
|
ksc->setGroup( "KSircSession" );
|
|
QMap<QString,QString> keyMap = ksc->entryMap( ksc->group() );
|
|
QMap<QString,QString>::Iterator it = keyMap.begin();
|
|
|
|
while(it != keyMap.end()) {
|
|
QString server = it.key();
|
|
QString port = KConfigGroup( ksc, "KSircSessionPort" ).readEntry( server );
|
|
// debug("%s", it.key().latin1());
|
|
KSircServer kss(server, port);
|
|
new_ksircprocess( kss ); // sets up proc_list
|
|
QStringList channels = ksc->readListEntry( server );
|
|
|
|
QStringList desktops = KConfigGroup( ksc, "KSircSessionDesktopNumbers" ).readListEntry( server );
|
|
|
|
for(uint i = 0; i < channels.count(); i++){
|
|
|
|
QString channel = channels[ i ];
|
|
|
|
proc_list[ server ]->new_toplevel( KSircChannel(server, channel), true );
|
|
|
|
KSircTopLevel *topLevel = dynamic_cast<KSircTopLevel *>( proc_list[ server ]->getWindowList()[ channel ] );
|
|
if ( !topLevel || !topLevel->isTopLevel() )
|
|
continue;
|
|
|
|
QStringList::ConstIterator desktopNumberIt = desktops.at( i );
|
|
if ( desktopNumberIt == desktops.end() )
|
|
continue;
|
|
|
|
int desktop = ( *desktopNumberIt ).toInt();
|
|
if ( desktop == -1 )
|
|
continue;
|
|
#ifdef Q_WS_X11
|
|
NETWinInfo winInfo( qt_xdisplay(), topLevel->winId(), qt_xrootwin(), NET::WMDesktop );
|
|
winInfo.setDesktop( desktop );
|
|
#endif
|
|
}
|
|
++it;
|
|
}
|
|
|
|
QRect geom;
|
|
|
|
// ksc->setGroup("ServerController");
|
|
// bool docked = ksc->readBoolEntry("Docked", FALSE);
|
|
// if ( !docked )
|
|
// show();
|
|
if(ksopts->runDocked == false)
|
|
show();
|
|
|
|
geom = ksc->readRectEntry("Size");
|
|
if(! geom.isEmpty())
|
|
setGeometry(geom);
|
|
|
|
ksc->setGroup(group);
|
|
}
|
|
|
|
void servercontroller::saveSessionConfig()
|
|
{
|
|
QDictIterator<KSircProcess> ksp(proc_list);
|
|
for (; ksp.current(); ++ksp ) {
|
|
ChannelSessionInfoList channels;
|
|
|
|
QDictIterator<KSircMessageReceiver> ksm(ksp.current()->getWindowList());
|
|
for (; ksm.current(); ++ksm )
|
|
if(ksm.currentKey()[0] != '!') { // Ignore !ksm's (system created)
|
|
ChannelSessionInfo sessionInfo;
|
|
|
|
sessionInfo.name = ksm.currentKey();
|
|
sessionInfo.port = ksp.current()->serverPort();
|
|
KSircTopLevel *topLev = dynamic_cast<KSircTopLevel *>( ksm.current() );
|
|
if ( topLev && topLev->isTopLevel() ) {
|
|
#ifdef Q_WS_X11
|
|
NETWinInfo winInfo( qt_xdisplay(), topLev->winId(), qt_xrootwin(), NET::WMDesktop );
|
|
sessionInfo.desktop = winInfo.desktop();
|
|
#endif
|
|
}
|
|
|
|
channels << sessionInfo;
|
|
}
|
|
|
|
if ( !channels.isEmpty() )
|
|
m_sessionConfig[ ksp.currentKey() ] = channels;
|
|
}
|
|
}
|
|
|
|
void servercontroller::showEvent( QShowEvent *e )
|
|
{
|
|
QWidget::showEvent( e );
|
|
if ( !e->spontaneous() )
|
|
saveDockingStatus();
|
|
}
|
|
|
|
void servercontroller::hideEvent( QHideEvent * )
|
|
{
|
|
/*
|
|
QWidget::hideEvent( e );
|
|
if ( !e->spontaneous() )
|
|
saveDockingStatus();
|
|
if(QWidget::isMinimized()){
|
|
hide();
|
|
KWin::setState(winId(), NET::SkipTaskbar);
|
|
}
|
|
*/
|
|
}
|
|
|
|
void servercontroller::saveDockingStatus()
|
|
{
|
|
if ( we_are_exiting ) // we are hidden by closeEvent
|
|
return;
|
|
|
|
// KConfig *kConfig = kapp->config();
|
|
// KConfigGroupSaver s( kConfig, "ServerController" );
|
|
// kConfig->writeEntry("Docked", !isVisible());
|
|
// kConfig->sync();
|
|
}
|
|
|
|
void servercontroller::endksirc(){
|
|
kapp->config()->sync();
|
|
exit(0);
|
|
}
|
|
|
|
void servercontroller::closeEvent( QCloseEvent *e )
|
|
{
|
|
we_are_exiting = true;
|
|
saveSessionConfig();
|
|
KMainWindow::closeEvent( e );
|
|
}
|
|
|
|
void servercontroller::WindowSelected(QListViewItem *item)
|
|
{
|
|
if ( !item )
|
|
return;
|
|
|
|
QListViewItem *parent_server = item->parent();
|
|
if(!parent_server)
|
|
return;
|
|
|
|
QString txt = QString(parent_server->text(0)) + "_" + item->text(0) + "_toplevel";
|
|
QWidget *obj = dynamic_cast<QWidget *>( objFinder::find(txt.utf8(), "KSircTopLevel"));
|
|
if(obj == 0x0){
|
|
txt =QString(parent_server->text(0)) + "_!" + item->text(0) + "_toplevel";
|
|
obj = dynamic_cast<QWidget *>( objFinder::find(txt.utf8(), "KSircTopLevel"));
|
|
}
|
|
|
|
if(obj != 0x0){
|
|
displayMgr->raise(obj);
|
|
}
|
|
else {
|
|
kdWarning() << "Did not find widget ptr to raise it" << endl;
|
|
}
|
|
}
|
|
|
|
|
|
QListViewItem * servercontroller::findChild( QListViewItem *parent,
|
|
const QString& text )
|
|
{
|
|
if ( !parent || parent->childCount() == 0 ) {
|
|
return 0L;
|
|
}
|
|
|
|
QListViewItem *item = parent->firstChild();
|
|
while ( item ) {
|
|
if ( item->text(0) == text ) {
|
|
return item;
|
|
}
|
|
item = item->nextSibling();
|
|
}
|
|
|
|
return 0L;
|
|
}
|
|
|
|
void servercontroller::increaseNotificationCount(const QString& reason, const QString& text)
|
|
{
|
|
dockWidget->startBlink(reason, text);
|
|
m_notificationCount++;
|
|
}
|
|
|
|
void servercontroller::decreaseNotificationCount(QString reason)
|
|
{
|
|
m_notificationCount--;
|
|
if ( m_notificationCount == 0 )
|
|
{
|
|
dockWidget->stopBlink(reason, true);
|
|
}
|
|
else {
|
|
dockWidget->stopBlink(reason, false);
|
|
}
|
|
}
|
|
|
|
void servercontroller::resetNotification()
|
|
{
|
|
m_notificationCount = 0;
|
|
dockWidget->stopBlink(QString::null, true);
|
|
QDictIterator<KSircProcess> it( proc_list );
|
|
while(it.current()){
|
|
it.current()->filters_update();
|
|
it.current()->getWindowList()["!all"]->control_message(RESET_NOTIF, "");
|
|
++it;
|
|
}
|
|
}
|
|
|
|
void servercontroller::do_autoconnect()
|
|
{
|
|
static int stime = 0;
|
|
static int ctime = 0;
|
|
int loop;
|
|
|
|
kdDebug(5008) << "Doing AUTOCONNECT" << endl;
|
|
|
|
KConfig *conf = kapp->config();
|
|
conf->setGroup("AutoConnect");
|
|
QStringList servers = conf->readListEntry("Servers");
|
|
servers.sort();
|
|
QStringList::ConstIterator ser = servers.begin();
|
|
|
|
loop = 0;
|
|
|
|
for( ; ser != servers.end(); ser++){
|
|
if(loop++ == stime){
|
|
stime++;
|
|
QString server = *ser;
|
|
QString port = "6667";
|
|
bool usessl = false;
|
|
QString pass = QString::null;
|
|
|
|
QRegExp rx("(.+) \\(SSL\\)(.*)");
|
|
if(rx.search(server) >= 0){
|
|
server = rx.cap(1) + rx.cap(3);
|
|
usessl = true;
|
|
}
|
|
rx.setPattern("(.+) \\(pass: (\\S+)\\)(.*)");
|
|
if(rx.search(server) >= 0){
|
|
server = rx.cap(1) + rx.cap(3);
|
|
pass = rx.cap(2);
|
|
}
|
|
rx.setPattern("([^: ]+):(\\d+)");
|
|
if(rx.search(server) >= 0){
|
|
server = rx.cap(1);
|
|
port = rx.cap(2);
|
|
}
|
|
kdDebug(5008) << server << ": Done " << port << " " << usessl << " " << pass << endl;
|
|
KSircServer kss(server, port, "", pass, usessl);
|
|
new_ksircprocess(kss);
|
|
return;
|
|
}
|
|
}
|
|
|
|
loop = 0;
|
|
|
|
ser = servers.begin();
|
|
for( ; ser != servers.end(); ser++){
|
|
QStringList channels = conf->readListEntry(*ser);
|
|
if(channels.empty() == FALSE){
|
|
channels.sort();
|
|
QStringList::ConstIterator chan = channels.begin();
|
|
for(; chan != channels.end(); chan++){
|
|
if(loop++ == ctime){
|
|
ctime++;
|
|
QString channel = *chan;
|
|
QString key = QString::null;
|
|
QRegExp crx("(.+) \\(key: (\\S+)\\)");
|
|
if(crx.search(channel) >= 0){
|
|
channel = crx.cap(1);
|
|
key = crx.cap(2);
|
|
}
|
|
QString server = *ser;
|
|
|
|
QRegExp rx("^([^ :]+)");
|
|
if(rx.search(server) >= 0){
|
|
server = rx.cap(1);
|
|
}
|
|
kdDebug(5008) << server << ": Channed: " << channel << " key: " << key << endl;
|
|
new_toplevel(KSircChannel(server, channel, key), true);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ctime = 0;
|
|
stime = 0;
|
|
at->stop();
|
|
delete at;
|
|
|
|
}
|
|
|
|
void servercontroller::start_autoconnect() {
|
|
at = new QTimer(this);
|
|
connect(at, SIGNAL(timeout()), this, SLOT(do_autoconnect()));
|
|
at->start(250, FALSE);
|
|
}
|
|
|
|
void servercontroller::start_autoconnect_check() {
|
|
|
|
KConfig *conf = kapp->config();
|
|
conf->setGroup("AutoConnect");
|
|
QStringList servers = conf->readListEntry("Servers");
|
|
|
|
if(servers.count() == 0){
|
|
KSPrefs *kp = new KSPrefs();
|
|
connect(kp, SIGNAL(update(int)),
|
|
this, SLOT(configChange()));
|
|
kp->resize(550, 450);
|
|
kp->showPage(7); /* Show auto connect page */
|
|
kp->show();
|
|
}
|
|
else {
|
|
at = new QTimer(this);
|
|
connect(at, SIGNAL(timeout()), this, SLOT(do_autoconnect()));
|
|
at->start(250, FALSE);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
scInside::scInside ( QWidget * parent, const char * name, WFlags
|
|
f )
|
|
: QFrame(parent, name, f)
|
|
{
|
|
ASConn = new QLabel(i18n("Active server connections:"), this, "servercontroller_label");
|
|
QFont asfont = ASConn->font();
|
|
asfont.setBold(TRUE);
|
|
ASConn->setFont(asfont);
|
|
|
|
ConnectionTree = new KListView(this, "connectiontree");
|
|
ConnectionTree->addColumn(QString::null);
|
|
ConnectionTree->setRootIsDecorated( true );
|
|
ConnectionTree->setSorting( 0 );
|
|
ConnectionTree->header()->hide();
|
|
}
|
|
|
|
scInside::~scInside()
|
|
{
|
|
delete ASConn;
|
|
delete ConnectionTree;
|
|
}
|
|
|
|
void scInside::resizeEvent ( QResizeEvent *e )
|
|
{
|
|
QFrame::resizeEvent(e);
|
|
ASConn->setGeometry(10,10, width() - 20,
|
|
ASConn->fontMetrics().height()+5);
|
|
ConnectionTree->setGeometry(10, 10 + ASConn->height(),
|
|
width() - 20, height() - 20 - ASConn->height());
|
|
}
|
|
|
|
#include "servercontroller.moc"
|