PeerManager Class Reference

#include <peermanager.h>

Inheritance diagram for PeerManager:

Inheritance graph
[legend]
Collaboration diagram for PeerManager:

Collaboration graph
[legend]
List of all members.

Detailed Description

Definition at line 36 of file peermanager.h.

Signals

void newConnection (Connection *connection)

Public Member Functions

 PeerManager (Client *client)
void setServerPort (int port)
QByteArray userName () const
void startBroadcasting ()
bool isLocalHostAddress (const QHostAddress &address)

Private Slots

void sendBroadcastDatagram ()
void readBroadcastDatagram ()

Private Member Functions

void updateAddresses ()

Private Attributes

Clientclient
QList< QHostAddressbroadcastAddresses
QList< QHostAddressipAddresses
QUdpSocket broadcastSocket
QTimer broadcastTimer
QByteArray username
int serverPort


Constructor & Destructor Documentation

PeerManager::PeerManager ( Client client  ) 

Definition at line 33 of file peermanager.cpp.

References QHostAddress::Any, QList< T >::at(), QUdpSocket::bind(), BroadcastInterval, broadcastPort, broadcastSocket, broadcastTimer, client, QObject::connect(), index, QStringList::indexOf(), QByteArray::isEmpty(), readBroadcastDatagram(), QUdpSocket::ReuseAddressHint, sendBroadcastDatagram(), serverPort, QTimer::setInterval(), QUdpSocket::ShareAddress, SIGNAL, QList< T >::size(), SLOT, QString::split(), QProcess::systemEnvironment(), QString::toUtf8(), updateAddresses(), and username.

00034     : QObject(client)
00035 {
00036     this->client = client;
00037 
00038     QStringList envVariables;
00039     envVariables << "USERNAME.*" << "USER.*" << "USERDOMAIN.*"
00040                  << "HOSTNAME.*" << "DOMAINNAME.*";
00041 
00042     QStringList environment = QProcess::systemEnvironment();
00043     foreach (QString string, envVariables) {
00044         int index = environment.indexOf(QRegExp(string));
00045         if (index != -1) {
00046             QStringList stringList = environment.at(index).split("=");
00047             if (stringList.size() == 2) {
00048                 username = stringList.at(1).toUtf8();
00049                 break;
00050             }
00051         }
00052     }
00053 
00054     if (username.isEmpty())
00055         username = "unknown";
00056 
00057     updateAddresses();
00058     serverPort = 0;
00059 
00060     broadcastSocket.bind(QHostAddress::Any, broadcastPort, QUdpSocket::ShareAddress
00061                          | QUdpSocket::ReuseAddressHint);
00062     connect(&broadcastSocket, SIGNAL(readyRead()),
00063             this, SLOT(readBroadcastDatagram()));
00064 
00065     broadcastTimer.setInterval(BroadcastInterval);
00066     connect(&broadcastTimer, SIGNAL(timeout()),
00067             this, SLOT(sendBroadcastDatagram()));
00068 }

Here is the call graph for this function:


Member Function Documentation

void PeerManager::setServerPort ( int  port  ) 

Definition at line 70 of file peermanager.cpp.

References serverPort.

Referenced by Client::Client().

00071 {
00072     serverPort = port;
00073 }

QByteArray PeerManager::userName (  )  const

Definition at line 75 of file peermanager.cpp.

References username.

Referenced by Client::newConnection(), and Client::nickName().

00076 {
00077     return username;
00078 }

void PeerManager::startBroadcasting (  ) 

Definition at line 80 of file peermanager.cpp.

References broadcastTimer, and QTimer::start().

Referenced by Client::Client().

00081 {
00082     broadcastTimer.start();
00083 }

bool PeerManager::isLocalHostAddress ( const QHostAddress address  ) 

Definition at line 85 of file peermanager.cpp.

References ipAddresses.

Referenced by readBroadcastDatagram().

00086 {
00087     foreach (QHostAddress localAddress, ipAddresses) {
00088         if (address == localAddress)
00089             return true;
00090     }
00091     return false;
00092 }

void PeerManager::newConnection ( Connection connection  )  [signal]

Referenced by readBroadcastDatagram().

void PeerManager::sendBroadcastDatagram (  )  [private, slot]

Definition at line 94 of file peermanager.cpp.

References QByteArray::append(), broadcastAddresses, broadcastPort, broadcastSocket, QByteArray::number(), serverPort, updateAddresses(), username, and QUdpSocket::writeDatagram().

Referenced by PeerManager().

00095 {
00096     QByteArray datagram(username);
00097     datagram.append('@');
00098     datagram.append(QByteArray::number(serverPort));
00099 
00100     bool validBroadcastAddresses = true;
00101     foreach (QHostAddress address, broadcastAddresses) {
00102         if (broadcastSocket.writeDatagram(datagram, address,
00103                                           broadcastPort) == -1)
00104             validBroadcastAddresses = false;
00105     }
00106 
00107     if (!validBroadcastAddresses)
00108         updateAddresses();
00109 }

void PeerManager::readBroadcastDatagram (  )  [private, slot]

Definition at line 111 of file peermanager.cpp.

References QList< T >::at(), broadcastSocket, client, connection, QByteArray::data(), emit, Client::hasConnection(), QUdpSocket::hasPendingDatagrams(), isLocalHostAddress(), newConnection(), QUdpSocket::pendingDatagramSize(), QUdpSocket::readDatagram(), QByteArray::resize(), serverPort, QByteArray::size(), QList< T >::size(), QByteArray::split(), and QByteArray::toInt().

Referenced by PeerManager().

00112 {
00113     while (broadcastSocket.hasPendingDatagrams()) {
00114         QHostAddress senderIp;
00115         quint16 senderPort;
00116         QByteArray datagram;
00117         datagram.resize(broadcastSocket.pendingDatagramSize());
00118         if (broadcastSocket.readDatagram(datagram.data(), datagram.size(),
00119                                          &senderIp, &senderPort) == -1)
00120             continue;
00121 
00122         QList<QByteArray> list = datagram.split('@');
00123         if (list.size() != 2)
00124             continue;
00125 
00126         int senderServerPort = list.at(1).toInt();
00127         if (isLocalHostAddress(senderIp) && senderServerPort == serverPort)
00128             continue;
00129 
00130         if (!client->hasConnection(senderIp)) {
00131             Connection *connection = new Connection(this);
00132             emit newConnection(connection);
00133             connection->connectToHost(senderIp, senderServerPort);
00134         }
00135     }
00136 }

void PeerManager::updateAddresses (  )  [private]

Definition at line 138 of file peermanager.cpp.

References QNetworkInterface::addressEntries(), QNetworkInterface::allInterfaces(), QNetworkAddressEntry::broadcast(), broadcastAddresses, QList< T >::clear(), QNetworkAddressEntry::ip(), ipAddresses, and QHostAddress::Null.

Referenced by PeerManager(), and sendBroadcastDatagram().

00139 {
00140     broadcastAddresses.clear();
00141     ipAddresses.clear();
00142     foreach (QNetworkInterface interface, QNetworkInterface::allInterfaces()) {
00143         foreach (QNetworkAddressEntry entry, interface.addressEntries()) {
00144             QHostAddress broadcastAddress = entry.broadcast();
00145             if (broadcastAddress != QHostAddress::Null) {
00146                 broadcastAddresses << broadcastAddress;
00147                 ipAddresses << entry.ip();
00148             }
00149         }
00150     }
00151 }

Here is the call graph for this function:


Member Data Documentation

Client* PeerManager::client [private]

Definition at line 58 of file peermanager.h.

Referenced by PeerManager(), and readBroadcastDatagram().

QList<QHostAddress> PeerManager::broadcastAddresses [private]

Definition at line 59 of file peermanager.h.

Referenced by sendBroadcastDatagram(), and updateAddresses().

QList<QHostAddress> PeerManager::ipAddresses [private]

Definition at line 60 of file peermanager.h.

Referenced by isLocalHostAddress(), and updateAddresses().

QUdpSocket PeerManager::broadcastSocket [private]

Definition at line 61 of file peermanager.h.

Referenced by PeerManager(), readBroadcastDatagram(), and sendBroadcastDatagram().

QTimer PeerManager::broadcastTimer [private]

Definition at line 62 of file peermanager.h.

Referenced by PeerManager(), and startBroadcasting().

QByteArray PeerManager::username [private]

Definition at line 63 of file peermanager.h.

Referenced by PeerManager(), sendBroadcastDatagram(), and userName().

int PeerManager::serverPort [private]

Definition at line 64 of file peermanager.h.

Referenced by PeerManager(), readBroadcastDatagram(), sendBroadcastDatagram(), and setServerPort().


The documentation for this class was generated from the following files:
Generated on Thu Mar 15 15:33:11 2007 for Qt 4.2 User's Guide by  doxygen 1.5.1