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 *********************************************************/