#include "wizard.h" #include "wizard.moc" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "types.h" #include "defines.h" #include "socket.h" #ifdef __bsdi__ #define IPPORT_USERRESERVED IPPORT_DYNAMIC #endif #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__sgi) #define IPPORT_USERRESERVED IPPORT_RESERVED #endif #define MIN_USER_PORT (unsigned short int)IPPORT_USERRESERVED #define MAX_USER_PORT 65535 MPWizard::MPWizard(const MPGameInfo &gi, ConnectionData &_cd, TQWidget *parent, const char *name) : KWizard(parent, name, TRUE), cd(_cd) { // setupTypePage(); // #### REMOVE NETWORK GAMES UNTIL FIXED type = Local; setupLocalPage(gi); } //----------------------------------------------------------------------------- void MPWizard::setupTypePage() { TDEConfigGroupSaver cg(kapp->config(), MP_GROUP); typePage = new TQVBox(this); typePage->setMargin(KDialogBase::marginHint()); TQVButtonGroup *vbg = new TQVButtonGroup(typePage); connect(vbg, TQ_SIGNAL(clicked(int)), TQ_SLOT(typeChanged(int))); TQRadioButton *b; b = new TQRadioButton(i18n("Create a local game"), vbg); b = new TQRadioButton(i18n("Create a network game"), vbg); b = new TQRadioButton(i18n("Join a network game"), vbg); type = (Type)cg.config()->readNumEntry(MP_GAMETYPE, 0); if ( type<0 || type>2 ) type = Local; vbg->setButton(type); typePage->setSpacing(KDialogBase::spacingHint()); net = new TQVGroupBox(i18n("Network Settings"), typePage); TQGrid *grid = new TQGrid(2, net); lserver = new TQLabel(" ", grid); grid->setSpacing(KDialogBase::spacingHint()); eserver = new TQLineEdit(grid); (void)new TQLabel(i18n("Port:"), grid); int p = cg.config()->readNumEntry(MP_PORT, (uint)MIN_USER_PORT); eport = new KIntNumInput(p, grid); eport->setRange(MIN_USER_PORT, MAX_USER_PORT, 1, false); addPage(typePage, i18n("Choose Game Type")); setHelpEnabled(typePage, FALSE); typeChanged(type); } //----------------------------------------------------------------------------- void MPWizard::setupLocalPage(const MPGameInfo &gi) { localPage = new TQVBox(this); localPage->setMargin(KDialogBase::marginHint()); wl = new WidgetList(5, localPage); TQSignalMapper *husm = new TQSignalMapper(this); if (gi.humanSettingSlot) connect(husm, TQ_SIGNAL(mapped(int)), gi.humanSettingSlot); TQSignalMapper *aism = new TQSignalMapper(this); if (gi.AISettingSlot) connect(aism, TQ_SIGNAL(mapped(int)), gi.AISettingSlot); TDEConfigGroupSaver cg(kapp->config(), MP_GROUP); TQString n; PlayerComboBox::Type type; PlayerLine *pl; Q_ASSERT( gi.maxNbLocalPlayers>0 ); for (uint i=0; ireadNumEntry(TQString(MP_PLAYER_TYPE).arg(i), (i==0 ? PlayerComboBox::Human : PlayerComboBox::None)); n = cg.config()->readEntry(TQString(MP_PLAYER_NAME).arg(i), i18n("Player #%1").arg(i)); pl = new PlayerLine(type, n, gi.humanSettingSlot, gi.AISettingSlot, i!=0, gi.AIAllowed, wl); connect(pl, TQ_SIGNAL(typeChanged(int)), TQ_SLOT(lineTypeChanged(int))); husm->setMapping(pl, i); connect(pl, TQ_SIGNAL(setHuman()), husm, TQ_SLOT(map())); aism->setMapping(pl, i); connect(pl, TQ_SIGNAL(setAI()), aism, TQ_SLOT(map())); wl->append(pl); } ((TQVBox *)localPage)->setSpacing(KDialogBase::spacingHint()); // keys = new TQPushButton(i18n("Configure Keys..."), localPage); // connect(keys, TQ_SIGNAL(clicked()), TQ_SLOT(configureKeysSlot())); addPage(localPage, i18n("Local Player's Settings")); setHelpEnabled(localPage, FALSE); lineTypeChanged(0); } TQString MPWizard::name(uint i) const { TQString s = wl->widget(i)->name(); if ( s.length()==0 ) s = i18n("Player #%1").arg(i); return s; } void MPWizard::typeChanged(int t) { type = (Type)t; TQString str; if ( type!=Client ) { str = "localhost"; lserver->setText(i18n("Hostname:")); } else { TDEConfigGroupSaver cg(kapp->config(), MP_GROUP); str = cg.config()->readEntry(MP_SERVER_ADDRESS, i18n("the.server.address")); lserver->setText(i18n("Server address:")); } eserver->setText(str); eserver->setEnabled(type==Client); eport->setEnabled(type!=Local); net->setEnabled(type!=Local); } void MPWizard::lineTypeChanged(int) { bool b = FALSE; for (uint i=0; isize(); i++) if ( wl->widget(i)->type()==PlayerComboBox::Human ) { b = TRUE; break; } // keys->setEnabled(b); } void MPWizard::accept() { TDEConfigGroupSaver cg(kapp->config(), MP_GROUP); cd.network = ( type!=Local ); cd.server = ( type!=Client ); if (cd.network) { //********************************************************** // create socket int flags = KExtendedSocket::inetSocket | KExtendedSocket::streamSocket; if (cd.server) flags |= KExtendedSocket::passiveSocket; TQString host = TQFile::encodeName(eserver->text()); KExtendedSocket *socket = new KExtendedSocket(host, eport->value(), flags); // do lookup int res = socket->lookup(); if ( checkSocket(res, socket, i18n("Error looking up for \"%1\"") .arg(host), this) ) { delete socket; return; } // connect (client) or listen (server) res = (cd.server ? socket->listen() : socket->connect()); if ( checkSocket(res, socket, i18n("Error opening socket"), this) ) { delete socket; return; } cd.rhd.socket = new Socket(socket, true); if ( !cd.server ) cg.config()->writeEntry(MP_SERVER_ADDRESS, eserver->text()); cg.config()->writeEntry(MP_PORT, eport->value()); } BoardData bd; for (uint i=0; isize(); i++) { if ( wl->widget(i)->type()==PlayerComboBox::None ) continue; bd.name = name(i); bd.type = wl->widget(i)->type(); cd.rhd.bds += bd; } cg.config()->writeEntry(MP_GAMETYPE, (int)type); for (uint i=0; isize(); i++) { cg.config()->writeEntry(TQString(MP_PLAYER_TYPE).arg(i), (int)wl->widget(i)->type()); cg.config()->writeEntry(TQString(MP_PLAYER_NAME).arg(i), name(i)); } KWizard::accept(); } void MPWizard::showPage(TQWidget *page) { if ( page==localPage ) setFinishEnabled(localPage, TRUE); KWizard::showPage(page); } void MPWizard::configureKeysSlot() { uint nb = 0; for (uint i=0; isize(); i++) if ( wl->widget(i)->type()==PlayerComboBox::Human ) nb++; emit configureKeys(nb); }