Source Code (Use browser search to find items of interest.)
Class Index
ksirtet'ServerNetMeeting (./kdegames/ksirtet/lib/meeting.h:77)
class ServerNetMeeting : public NetMeeting
{
Q_OBJECT
public:
ServerNetMeeting(const cId &id,
const RemoteHostData &rhd, MPOptionWidget *options,
QList<RemoteHostData> &arhd,
QWidget *parent = 0, const char * name = 0);
private slots:
void newHost(int);
void textChanged(const QString &text);
void typeChanged(MeetingCheckBox::Type);
void accept();
void optionsChanged();
private:
QList<RemoteHostData> &rhd;
void idFlag(uint i);
void newFlag(uint i);
void endFlag(uint i);
void modTypeFlag(uint i);
void modTextFlag(uint i);
void netError(uint i, const QString &str);
void writeToAll(uint i = 0);
void disconnectHost(uint i, const QString &str);
};
ksirtet'ServerNetMeeting::ServerNetMeeting() (./kdegames/ksirtet/lib/meeting.cpp:214)
ServerNetMeeting::ServerNetMeeting(const cId &id,
const RemoteHostData &r, MPOptionWidget *option,
QList<RemoteHostData> &arhd, QWidget *parent, const char * name)
: NetMeeting(id, r.socket, option, TRUE, parent, name), rhd(arhd)
{
connect(sm[0]->notifier(), SIGNAL(activated(int)), SLOT(newHost(int)));
players.append(Accepted); // server
// set server line
ExtData ed(r.bds, "", MeetingCheckBox::Ready);
spl->setData(ed);
connect(spl, SIGNAL(textChanged(const QString &)),
SLOT(textChanged(const QString &)));
// options signal
if (ow) connect(ow, SIGNAL(changed()), SLOT(optionsChanged()));
}
ksirtet'ServerNetMeeting::writeToAll() (./kdegames/ksirtet/lib/meeting.cpp:232)
void ServerNetMeeting::writeToAll(uint i)
{
for (uint k=1; k<sm.size(); k++) {
if ( k==i ) continue;
if ( !sm.writeCommon(k) ) writeError(k);
}
sm.commonWritingStream().clear();
}
ksirtet'ServerNetMeeting::netError() (./kdegames/ksirtet/lib/meeting.cpp:241)
void ServerNetMeeting::netError(uint i, const QString &type)
{
ASSERT( i!=0 );
disconnectHost(i, i18n("%1 client #%2 : disconnect it").arg(type).arg(i));
}
ksirtet'ServerNetMeeting::disconnectHost() (./kdegames/ksirtet/lib/meeting.cpp:247)
void ServerNetMeeting::disconnectHost(uint i, const QString &str)
{
sm.remove(i);
socketRemoved = TRUE;
if ( players[i]==Accepted ) {
removeLine(i-1);
// Send a Del message to all (other) clients
sm.commonWritingStream() << Del << i;
writeToAll();
}
players.remove(players.at(i));
message(str);
}
ksirtet'ServerNetMeeting::newHost() (./kdegames/ksirtet/lib/meeting.cpp:262)
void ServerNetMeeting::newHost(int)
{
int fd;
QString tmp1, tmp2;
if ( !acceptInetSocket(sm[0]->fd(), fd, tmp1, tmp2) ) {
message(i18n("Failed to accept incoming client"));
return;
}
players.append(NewPlayer);
uint i = sm.append(fd, SocketManager::ReadWrite, TRUE, this);
connect(sm[i]->notifier(), SIGNAL(activated(int)), SLOT(readNotifier(int)));
sm[i]->notifier()->setEnabled(TRUE);
}
ksirtet'ServerNetMeeting::idFlag() (./kdegames/ksirtet/lib/meeting.cpp:276)
void ServerNetMeeting::idFlag(uint i)
{
bool b = checkAndSetState(i, NewPlayer, IdChecked);
ASSERT(b);
// get client id
cId clientId;
sm[i]->readingStream() >> clientId;
CHECK_READ(i);
// compare id
id.check(clientId);
// send result to client
Stream &s = sm[i]->writingStream();
s << Id << id;
WRITE(i);
// if not accepted : remove socket and player from list
if ( !id.accepted() ) disconnectHost(i, i18n("Client rejected for incompatible ID"));
}
ksirtet'ServerNetMeeting::endFlag() (./kdegames/ksirtet/lib/meeting.cpp:298)
void ServerNetMeeting::endFlag(uint i)
{
disconnectHost(i, i18n("Client #%1 has left").arg(i));
}
ksirtet'ServerNetMeeting::newFlag() (./kdegames/ksirtet/lib/meeting.cpp:303)
void ServerNetMeeting::newFlag(uint i)
{
checkAndSetState(i, IdChecked, Accepted);
// get line infos from new client (GameData struct)
MeetingLineData pld;
sm[i]->readingStream() >> pld.ed.bds;
CHECK_READ(i);
// complete the MeetingLineData struct with initial values
pld.own = FALSE; // client line
pld.ed.type = MeetingCheckBox::NotReady; // not ready by default
pld.ed.text = ""; // empty line to begin with
appendLine(pld, TRUE);
// send to the new client already present lines including its own
// (New flag + MeetingLineData struct)
spl->data(pld.ed);
sm[i]->writingStream() << New << pld.ed;
for(uint k=1; k<sm.size(); k++) {
wl->widget(k-1)->data(pld.ed);
pld.own = ( k==i );
sm[i]->writingStream() << New << pld;
}
WRITE(i);
// send to all other clients the new line (New flag + MeetingLineData struct)
wl->widget(i-1)->data(pld.ed);
pld.own = FALSE;
sm.commonWritingStream() << New << pld;
writeToAll(i);
}
ksirtet'ServerNetMeeting::modTextFlag() (./kdegames/ksirtet/lib/meeting.cpp:336)
void ServerNetMeeting::modTextFlag(uint i)
{
checkState(i-1, Accepted);
// the client i has just sent a new text (QString)
TextInfo ti;
sm[i]->readingStream() >> ti.text;
CHECK_READ(i);
ti.i = i;
setText(ti);
// send it to all other clients (Mod_Text flag + TextInfo struct)
sm.commonWritingStream() << Mod_Text << ti;
writeToAll(i);
}
ksirtet'ServerNetMeeting::modTypeFlag() (./kdegames/ksirtet/lib/meeting.cpp:352)
void ServerNetMeeting::modTypeFlag(uint i)
{
checkState(i-1, Accepted);
// a client has just sent a new TCB type (TCB type)
TypeInfo ti;
sm[i]->readingStream() >> ti.type;
CHECK_READ(i);
ti.i = i;
setType(ti);
// send it to all other clients (Mod_Type flag + TypeInfo struct)
sm.commonWritingStream() << Mod_Type << ti;
writeToAll(i);
}
ksirtet'ServerNetMeeting::textChanged() (./kdegames/ksirtet/lib/meeting.cpp:368)
void ServerNetMeeting::textChanged(const QString &text)
{
// server line text changed : send to every clients (Mod_Text flag + TextInfo struct)
TextInfo ti; ti.i = 0; ti.text = text;
sm.commonWritingStream() << Mod_Text << ti;
writeToAll();
}
ksirtet'ServerNetMeeting::typeChanged() (./kdegames/ksirtet/lib/meeting.cpp:376)
void ServerNetMeeting::typeChanged(MeetingCheckBox::Type type)
{
ASSERT( sender()!=spl ); // server TCB not modifiable
// the server has changed a client TCB
// find the changed TCB index
TypeInfo ty;
ty.type = type;
for (ty.i=0; ty.i<wl->size(); ty.i++)
if ( sender()==wl->widget(ty.i) ) break;
ty.i++;
// TCB change : send to every clients (Mod_Type flag + TypeInfo struct)
sm.commonWritingStream() << Mod_Type << ty;
writeToAll();
if (server) enableButtonOK(ready());
}
ksirtet'ServerNetMeeting::accept() (./kdegames/ksirtet/lib/meeting.cpp:394)
void ServerNetMeeting::accept()
{
ASSERT( ready() && rhd.count()==0 );
// stop receiving data from clients (will be buffered by OS)
for (uint k=0; k<sm.size(); k++) disconnect(sm[k]->notifier());
sm.remove(0);
// check which client will play and fill RemoteHostData array
ExtData ed;
bool willPlay;
for (uint k=1; k<players.count(); k++) {
willPlay = FALSE;
if ( players[k]==Accepted ) { // client with lines
wl->widget(k-1)->data(ed);
if ( ed.type==MeetingCheckBox::Ready ) {
willPlay = TRUE;
RemoteHostData *r = new RemoteHostData;
r->socket = sm[0]->fd();
r->bds = ed.bds;
rhd.append(r);
}
// send play message to client (Play flag
// + bool [accepted/rejected])
sm[0]->writingStream() << Play << (Q_UINT8)willPlay;
// if write failed and the client is not playing : silently
// put it aside ...
if ( !sm[0]->write() && willPlay ) {
cleanReject(i18n("Cannot write to client #%1 at game beginning"));
return;
}
}
sm.remove(0, !willPlay); // do not close player sockets
}
KDialogBase::accept();
}
ksirtet'ServerNetMeeting::optionsChanged() (./kdegames/ksirtet/lib/meeting.cpp:435)
void ServerNetMeeting::optionsChanged()
{
sm.commonWritingStream() << Mod_Opt;
ow->dataOut( sm.commonWritingStream() );
writeToAll();
}
/** ClientNetMeeting *********************************************************/