Source Code (Use browser search to find items of interest.)

Class Index

ksirtet'SocketManager (./kdegames/ksirtet/lib/smanager.h:15)

class SocketManager
{
 public:
 	SocketManager();
	
	/** Be aware that unremoved sockets will be closed there. */
	~SocketManager();
	
	/** Remove all sockets and close them. */
	void clean();
	
	enum SocketProperty { ReadOnly, WriteOnly, ReadWrite };

	/** @return the number of sockets. */
	uint size() const { return sockets.size(); };

	Socket *at(uint i);
	Socket *operator [](uint i) { return at(i); }

	/** @return the index of the socket (-1 if not present). */
	int find(int fd);
	
	/** 
	 * Append a socket at the end of the array of sockets.
	 * @param sp determines if the socket will be used for ReadWrite,
	 * ReadOnly or WriteOnly operations.
	 * @return the index of the socket.
	 */
	uint append(int fd, SocketProperty sp = ReadWrite, bool createNotifier = FALSE,
				QObject *parent = 0, const char *name = 0);

	/** 
	 * Remove the socket indexed <I>i</I>. Note that the following sockets in
	 * the array will have their index decremented by one.
	 * @param close determines if the removed socket should be closed.
	 * @return the value of the removed socket.
	 */
	int remove(uint i, bool close = TRUE);

	/** @return TRUE if it is possible to write to all the writeable sockets. */
	bool canWriteAll(uint sec = 0, uint usec = 0);

    /** @return TRUE if it is possible to write to the specified socket. */
	bool canWrite(uint i, uint sec = 0, uint usec = 0);
	
	Stream &commonWritingStream() { return writing; }
	bool writeCommon(uint i); // do not clear stream

	/**
	 * Check if there are pending data on at least one of the readeable
	 * socket.
	 */
	bool checkPendingData(uint sec = 0, uint usec = 0);
	
	bool dataPending(uint i);
	
 private:
	QArray<Socket *> sockets;
	
	fd_set read_set, write_set, read_tmp, write_tmp;
	struct timeval tv;
	int max_fd;
	uint nbWriteable;

	WritingStream writing;
};

ksirtet'SocketManager::SocketManager() (./kdegames/ksirtet/lib/smanager.cpp:23)

SocketManager::SocketManager()
{
	max_fd = 0;
	FD_ZERO(&read_set);
	FD_ZERO(&write_set);
	nbWriteable = 0;
}


ksirtet'SocketManager::~SocketManager() (./kdegames/ksirtet/lib/smanager.cpp:31)

SocketManager::~SocketManager()
{
	clean();
}


ksirtet'SocketManager::clean() (./kdegames/ksirtet/lib/smanager.cpp:36)

void SocketManager::clean()
{
	for(uint i=0; i<sockets.size(); i++) delete sockets[i];
	sockets.resize(0);
}


ksirtet'SocketManager::at() (./kdegames/ksirtet/lib/smanager.cpp:42)

Socket *SocketManager::at(uint i)
{
	ASSERT( i<sockets.size() );
	return sockets[i];
}


ksirtet'SocketManager::find() (./kdegames/ksirtet/lib/smanager.cpp:48)

int SocketManager::find(int fd)
{
	for(uint i=0; i<sockets.size(); i++)
		if ( sockets[i]->fd()==fd ) return i;
	return -1;
}


ksirtet'SocketManager::append() (./kdegames/ksirtet/lib/smanager.cpp:55)

uint SocketManager::append(int fd, SocketProperty sp, bool createNotifier,
						   QObject *parent, const char *name)
{
	ASSERT( fd!=-1 );
	
	uint s = sockets.size();
	sockets.resize(s+1);
	sockets[s] = new Socket(fd, createNotifier, parent, name);
	
	max_fd = QMAX(max_fd, fd);
	
	if ( sp==ReadWrite || sp==ReadOnly ) FD_SET(fd, &read_set);
	if ( sp==ReadWrite || sp==WriteOnly ) {
		nbWriteable++;
		FD_SET(fd, &write_set);
	}

	return s;
}


ksirtet'SocketManager::remove() (./kdegames/ksirtet/lib/smanager.cpp:75)

int SocketManager::remove(uint i, bool Close)
{
	Socket *so = at(i);

	uint s = sockets.size()-1;
	for(uint j=i; j<s; j++) sockets[j] = sockets[j+1];
	sockets.resize(s);

	max_fd = 0;
	for(uint j=0; j<s; j++) 
		max_fd = QMAX(max_fd, sockets[j]->fd());

	int fd = so->fd();
	if ( FD_ISSET(fd, &read_set) ) FD_CLR(fd, &read_set);
	if ( FD_ISSET(fd, &write_set) ) {
		nbWriteable--;
		FD_CLR(fd, &write_set);
	}

	if (!Close) so->remove();
	delete so;
	return fd;
}


ksirtet'SocketManager::canWriteAll() (./kdegames/ksirtet/lib/smanager.cpp:99)

bool SocketManager::canWriteAll(uint sec, uint usec)
{
	write_tmp = write_set;
	tv.tv_sec = sec;
    tv.tv_usec = usec;
    return ( select(max_fd+1, 0, &write_tmp, 0, &tv)==(int)nbWriteable );
}


ksirtet'SocketManager::canWrite() (./kdegames/ksirtet/lib/smanager.cpp:107)

bool SocketManager::canWrite(uint i, uint sec, uint usec)
{
	int fd = at(i)->fd();
	FD_ZERO(&write_tmp);
	FD_SET(fd, &write_tmp);
	tv.tv_sec = sec;
	tv.tv_usec = usec;
	return ( select(fd+1, 0, &write_tmp, 0, &tv)==1 );
}


ksirtet'SocketManager::checkPendingData() (./kdegames/ksirtet/lib/smanager.cpp:117)

bool SocketManager::checkPendingData(uint sec, uint usec)
{
	read_tmp = read_set;
	tv.tv_sec = sec;
    tv.tv_usec = usec;
	return ( select(max_fd+1, &read_tmp, 0, 0, &tv)!=-1 );
}


ksirtet'SocketManager::dataPending() (./kdegames/ksirtet/lib/smanager.cpp:125)

bool SocketManager::dataPending(uint i)
{
	int fd = at(i)->fd();
	return FD_ISSET(fd, &read_tmp);
}


ksirtet'SocketManager::writeCommon() (./kdegames/ksirtet/lib/smanager.cpp:131)

bool SocketManager::writeCommon(uint i)
{
	return at(i)->write(writing.buffer());
}