#include "AsynchronCall.h"

using namespace Framework;

// Inhalt der AsynchronCall Klasse
// Konstruktor
//  f: Die Funktion die asynchron aufgerufen werden soll
//  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
AsynchronCall::AsynchronCall( std::function< void() > f )
    : Thread()
{
    this->finished = 0;
    this->f = f;
    start();
}

// Inhalt der AsynchronCall Klasse
// Konstruktor
//  name: Der Name des Threads
//  f: Die Funktion die asynchron aufgerufen werden soll
//  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
AsynchronCall::AsynchronCall( const char* name, std::function< void() > f )
    : Thread()
{
    setName( name );
    this->finished = 0;
    this->f = f;
    start();
}

// Konstruktor
//  f: Die Funktion die asynchron aufgerufen werden soll
//  finished: Wird auf 1 gesetzt wenn der Aufruf abgearbeitet wurde
//  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
AsynchronCall::AsynchronCall( std::function< void() > f, bool* finished )
    : Thread()
{
    this->finished = finished;
    this->f = f;
    if( finished )
        finished = 0;
    start();
}

// Konstruktor
//  name: Der Name des Threads
//  f: Die Funktion die asynchron aufgerufen werden soll
//  finished: Wird auf 1 gesetzt wenn der Aufruf abgearbeitet wurde
//  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
AsynchronCall::AsynchronCall( const char* name, std::function< void() > f, bool* finished )
    : Thread()
{
    setName( name );
    this->finished = finished;
    this->f = f;
    if( finished )
        finished = 0;
    start();
}

void AsynchronCall::thread()
{
    f();
}

void AsynchronCall::threadEnd()
{
    Thread::threadEnd();
    if( finished )
        *finished = 1;
    release();
}