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