/**
 * $Id$
 * $Revision$
 * $Author$
 * $Date$
 *
 * This file is part of The iWear Framework.
 * In particular this file is part of the Framework Output
 *
 * The iWear Framework is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by the
 * Free Software Foundation as in version 2 of the License.

 * 
 * The iWear Framework is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * The iWear Framework; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __OUTPUTDATATHREADEDFUNCTOR_H
#define __OUTPUTDATATHREADEDFUNCTOR_H

// Standard includes
#include <string>

// iWear includes
#ifndef __FUNCTOR_H
#include <iwear/functor.h>
#endif

#ifndef __UID_H
#include <iwear/uid.h>
#endif

#ifndef __ATOMICCOUNTER_H
#include <iwear/atomiccounter.h>
#endif

#include <iwear/debugstream.h>
#include <iwear/utility.h>

#include <iwear_output/outputdatafunctor.h>
#include <iwear_output/outputdatafunctorparameter.h>

namespace iwear {
namespace output {

class OutputDataThreadedFunctor : public VoidFunctor {

public:

    OutputDataThreadedFunctor(OutputDataFunctor& functor, 
			      OutputDataFunctorParameter& odf_parameter,
			      AtomicCounter<uint32_t>& counter);
    
    virtual ~OutputDataThreadedFunctor(void);

    virtual void operator()(){
	// since this functor will be executed in a thread we need to ensure
	// that the counter is > 0 as long as operator() of member functor is
	// not finished!
	++counter;
	// maybe an application needs to prevent the destruction of the
	// outputdata -> then it can increase the counter so the odo will
	// wait..
	odf_parameter.set_counter(counter);
	functor(odf_parameter);
	--counter;	
	delete &odf_parameter;
	delete this;
    }

private:
    OutputDataFunctor& functor;
    OutputDataFunctorParameter& odf_parameter;
    AtomicCounter<uint32_t>& counter;
};

} // namespace output
} // namespace iwear

#endif // __OUTPUTDATATHREADEDFUNCTOR_H

