#include <QtCore/QCoreApplication>
#include <QtCore/QSignalMapper>
#include <QtCore/QStringList>
#include <QtNetwork/QNetworkInterface>
#include <QtNetwork/QHostAddress>
#include <QtNetwork/QTcpServer>
#include <iostream>
#include "greeter.h"


int main(int argc, char *argv[])
{
  QCoreApplication app(argc, argv);
  int port = app.arguments().at(1).toInt();

  Greeter* greeter = new Greeter(&app);

  QSignalMapper* sigMap;
  sigMap = new QSignalMapper(&app);
  greeter->connect(sigMap,
           SIGNAL(mapped(QObject *)),
	   SLOT(newConnection(QObject *)));

  QList<QTcpServer> servers;

  QList<QNetworkInterface> ifs;
  ifs = QNetworkInterface::allInterfaces();
  
  foreach(const QNetworkInterface& i, ifs) {
    QList<QNetworkAddressEntry> entries;
    entries = i.addressEntries();

    foreach(const QNetworkAddressEntry& entry, entries) {
      QHostAddress address = entry.ip();

      // fix scope of link-local addresses
      Q_IPV6ADDR addr6;// = address.toIPv6Address();
      addr6 = address.toIPv6Address();
      if (addr6[0] == 0xfe &&
	  addr6[1] == 0x80) {
	QString name=i.humanReadableName();
	address.setScopeId(name);
      }

      QTcpServer* server;
      server = new QTcpServer(&app);    
      sigMap->setMapping(server, server);
      sigMap->connect(server,
		  SIGNAL(newConnection()), 
		  SLOT(map()));

      server->listen(address, port);
      if (!server->isListening()) {
	std::cout << "Cannot listen on " 
		  << address.toString().toAscii().constData() << std::endl;
      }     
    }
  }

  return app.exec();
}