Source Code (Use browser search to find items of interest.)
Class Index
ksirtet'NetMeeting (./kdegames/ksirtet/lib/meeting.h:13)
class NetMeeting : public KDialogBase
{
Q_OBJECT
public:
// "gameName" and "gameId" are QByteArray because they are
// used for ID comparing between games.
NetMeeting( const cId &id, int socket, MPOptionWidget *option, bool server,
QWidget *parent = 0, const char * name = 0);
virtual ~NetMeeting() {};
protected slots:
void readNotifier(int socket);
virtual void textChanged(const QString &) = 0;
virtual void typeChanged(MeetingCheckBox::Type) = 0;
virtual void reject();
virtual void accept() {}
protected:
enum PlayerState { NewPlayer, IdChecked, Accepted };
QValueList<PlayerState> players;
bool server;
MeetingLine *spl;
WidgetList<MeetingLine> *wl;
SocketManager sm;
MPOptionWidget *ow;
cId id;
bool socketRemoved;
void appendLine(const MeetingLineData &pld, bool server);
void removeLine(uint i);
void setType(const TypeInfo &ti);
void setText(const TextInfo &ti);
void cleanReject(const QString &str = QString::null);
bool checkState(uint i, PlayerState s);
bool checkAndSetState(uint i, PlayerState os, PlayerState ns);
bool ready() const;
virtual void idFlag(uint i) { dataError(i); }
virtual void newFlag(uint i) { dataError(i); }
virtual void endFlag(uint i) { dataError(i); }
virtual void modTypeFlag(uint i) { dataError(i); }
virtual void modTextFlag(uint i) { dataError(i); }
virtual void delFlag(uint i) { dataError(i); }
virtual void modOptFlag(uint i) { dataError(i); }
virtual void playFlag(uint i) { dataError(i); }
virtual void netError(uint i, const QString &str) = 0;
virtual void writeToAll(uint i=0) = 0;
void readError(uint i);
void writeError(uint i);
void dataError(uint i);
void brokeError(uint i);
void message(const QString &str);
private:
QLabel *labWait;
QStatusBar *status;
void waiting();
void readData(uint i);
};
ksirtet'NetMeeting::NetMeeting() (./kdegames/ksirtet/lib/meeting.cpp:13)
NetMeeting::NetMeeting(const cId &_id, int socket, MPOptionWidget *option,
bool _server, QWidget *parent, const char * name)
: KDialogBase(Plain, i18n("Network meeting"),
(_server ? Ok|Cancel|Help : Cancel|Help),
(_server ? Ok : Cancel), parent, name),
server(_server), ow(option), id(_id), socketRemoved(FALSE)
{
sm.append(socket, SocketManager::ReadWrite, TRUE, this);
sm[0]->notifier()->setEnabled(TRUE);
QLabel *lab;
QFont f( font() );
f.setBold(TRUE);
/* top layout */
QVBoxLayout *top = new QVBoxLayout(plainPage(), spacingHint());
top->setResizeMode(QLayout::Fixed);
/* title */
lab = new QLabel(i18n("Network Meeting"), plainPage());
lab->setFont(f);
lab->setAlignment(AlignCenter);
lab->setFrameStyle(QFrame::Panel | QFrame::Raised);
top->addWidget(lab);
top->addSpacing(spacingHint());
// server line
spl = new MeetingLine(server, server, plainPage());
top->addWidget(spl);
// widget list
wl = new WidgetList<MeetingLine>(LIST_INTERVAL, plainPage());
wl->hide();
top->addWidget(wl);
labWait = new QLabel(i18n("Waiting for clients"), plainPage());
labWait->setAlignment(AlignCenter);
top->addWidget(labWait);
// options widget
// if (ow) top->addWidget(ow); #### FIXME
// status bar
status = new QStatusBar(plainPage());
top->addWidget(status);
// buttons
enableButtonSeparator(TRUE);
if (server) {
setButtonOKText(i18n("Start Game"));
enableButtonOK(FALSE);
}
setButtonCancelText(server ? i18n("Abort") : i18n("Quit"));
enableButton(Help, FALSE);
}
ksirtet'NetMeeting::appendLine() (./kdegames/ksirtet/lib/meeting.cpp:69)
void NetMeeting::appendLine(const MeetingLineData &pld, bool server)
{
MeetingLine *pl;
pl = new MeetingLine(pld.own, server, wl);
if (pld.own) connect(pl, SIGNAL(textChanged(const QString &)),
SLOT(textChanged(const QString &)));
else message(i18n("A new client has just arrived (#%1)")
.arg(wl->size()+1));
pl->setData(pld.ed);
connect(pl, SIGNAL(typeChanged(MeetingCheckBox::Type)),
SLOT(typeChanged(MeetingCheckBox::Type)));
wl->append(pl);
waiting();
}
ksirtet'NetMeeting::removeLine() (./kdegames/ksirtet/lib/meeting.cpp:84)
void NetMeeting::removeLine(uint i)
{
wl->remove(i);
waiting();
}
ksirtet'NetMeeting::waiting() (./kdegames/ksirtet/lib/meeting.cpp:90)
void NetMeeting::waiting()
{
if ( wl->size() ) {
labWait->hide();
wl->show();
} else {
labWait->show();
wl->hide();
}
if (server) enableButtonOK(ready());
}
ksirtet'NetMeeting::setType() (./kdegames/ksirtet/lib/meeting.cpp:102)
void NetMeeting::setType(const TypeInfo &ti)
{
if ( ti.i==0 ) spl->setType(ti.type); // in fact should not append
else {
wl->widget(ti.i-1)->setType(ti.type);
if (server) enableButtonOK(ready());
}
}
ksirtet'NetMeeting::setText() (./kdegames/ksirtet/lib/meeting.cpp:111)
void NetMeeting::setText(const TextInfo &ti)
{
if ( ti.i==0 ) spl->setText(ti.text);
else wl->widget(ti.i-1)->setText(ti.text);
}
ksirtet'NetMeeting::ready() (./kdegames/ksirtet/lib/meeting.cpp:117)
bool NetMeeting::ready() const
{
int nbReady = 0;
for(uint k=0; k<wl->size(); k++) {
switch ( wl->widget(k)->type() ) {
case MeetingCheckBox::Ready : nbReady++; break;
case MeetingCheckBox::NotReady : return FALSE;
default : break;
}
}
return ( nbReady!=0 );
}
ksirtet'NetMeeting::cleanReject() (./kdegames/ksirtet/lib/meeting.cpp:130)
void NetMeeting::cleanReject(const QString &str)
{
sm.clean(); // remove the sockets immediatly to avoid possible further mess
if ( !str.isEmpty() )
KMessageBox::information(this, str, caption());
KDialogBase::reject();
}
ksirtet'NetMeeting::readNotifier() (./kdegames/ksirtet/lib/meeting.cpp:142)
void NetMeeting::readNotifier(int fd)
{
uint i = sm.find(fd);
switch ( sm[i]->read() ) {
case -1: readError(i); break;
case 0: brokeError(i); break;
default: readData(i);
}
}
ksirtet'NetMeeting::readData() (./kdegames/ksirtet/lib/meeting.cpp:152)
void NetMeeting::readData(uint i)
{
// get message type
MeetingMsgFlag mt;
sm[i]->readingStream() >> mt;
CHECK_READ(i);
switch (mt) {
case End: endFlag(i); break;
case New: newFlag(i); break;
case Mod_Text: modTextFlag(i); break;
case Mod_Type: modTypeFlag(i); break;
case Id: idFlag(i); break;
case Del: delFlag(i); break;
case Mod_Opt: modOptFlag(i); break;
case Play: playFlag(i); break;
default: dataError(i);
}
if (socketRemoved) socketRemoved = FALSE;
else if ( !sm[i]->readingStream().atEnd() )
readData(i); // more pending data
}
ksirtet'NetMeeting::readError() (./kdegames/ksirtet/lib/meeting.cpp:176)
void NetMeeting::readError(uint i)
{ netError(i, i18n("Error reading data from")); }
ksirtet'NetMeeting::dataError() (./kdegames/ksirtet/lib/meeting.cpp:178)
void NetMeeting::dataError(uint i)
{ netError(i, i18n("Unknown data from")); }
ksirtet'NetMeeting::writeError() (./kdegames/ksirtet/lib/meeting.cpp:180)
void NetMeeting::writeError(uint i)
{ netError(i, i18n("Error writing to")); }
ksirtet'NetMeeting::brokeError() (./kdegames/ksirtet/lib/meeting.cpp:182)
void NetMeeting::brokeError(uint i)
{ netError(i, i18n("Link broken or empty data from")); }
ksirtet'NetMeeting::checkState() (./kdegames/ksirtet/lib/meeting.cpp:185)
bool NetMeeting::checkState(uint i, PlayerState s)
{
bool ok = ( players[i]==s );
if (!ok) dataError(i);
return ok;
}
ksirtet'NetMeeting::checkAndSetState() (./kdegames/ksirtet/lib/meeting.cpp:192)
bool NetMeeting::checkAndSetState(uint i, PlayerState os, PlayerState ns)
{
bool ok = checkState(i, os);
if (ok) players[i] = ns;
return ok;
}
ksirtet'NetMeeting::reject() (./kdegames/ksirtet/lib/meeting.cpp:199)
void NetMeeting::reject()
{
// send an End flag
sm.commonWritingStream() << End;
writeToAll();
cleanReject();
}
ksirtet'NetMeeting::message() (./kdegames/ksirtet/lib/meeting.cpp:208)
void NetMeeting::message(const QString &str)
{
status->message(str, 3000);
}
/** ServerNetMeeting *********************************************************/