#ifndef CONNECTIONFACTORY_H
#define CONNECTIONFACTORY_H
#include <stdio.h>
#include <iostream>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string>

#include "Connection.h"
#include "FilterConnection.h"
#include "InputConnection.h"
#include "OutputConnection.h"
#include "ConfigConnection.h"
#include "ConnectionWrap.h"
#include "BufferedFile.h"
#include "BufferedFileFactory.h"

/**
 * The ConnectionFactory is used to create connections from client who have
 * connected to ports the connectionFactory is listening to.
 */
class ConnectionFactory {
	public:
	/**
	 * Constructor, creates a ConnectionFactory using a BufferedFileFactory and start port for inputPort.
	 * Other ports are after outPort = input+1, filterPort=input+2, configPort = input+3
	 * */
	ConnectionFactory(BufferedFileFactory * bff,int start);
	/**
	 * Constructor, creates a ConnectionFactory using a BufferedFileFactory and the inputPort, outputPort, filterPort, configPort.
	 * */
	ConnectionFactory(BufferedFileFactory * bff,int inputPort,int outputPort,int filterPort,int configPort);
	/**
	 * Is there a new connection ready?
	 * */
	bool isThereANewConnection();
	/**
	 * Get the new connection and put it in a ConnectionWrap.
	 * */
	ConnectionWrap * ConnectionFactory::processConnection();   //return NULL for ones that weren't recorded.. This is
	/**
	 * Destructor
	 * */
	~ConnectionFactory();
	private:
	void init(BufferedFileFactory * bff, int inputPort,int outputPort,int filterPort,int configPort);
	int inputfd;
	int outputfd;
	int filterfd;
	int configfd;
	BufferedFile *  inputBF;
	BufferedFile * outputBF;
	BufferedFile * filterBF;
	BufferedFile * configBF;
	BufferedFileFactory * bf;
	BufferedFile * acceptAndGetFile(int fdin);
};
#endif
