// Common, group WinWrap
// see CW Class Library
// Copyright Alexander Liss

#include "waitable.h"

void WaitableCollection::copy(const WaitableCollection& z)
{
	size=z.size;
	for(int i=0;i<size;++i)
		handles[i]=z.handles[i];
}


int WaitableCollection::add(const WaitableObject& z)
{
	if (size >= MAXIMUM_WAIT_OBJECTS)
        return 1;

    handles[size++] = z.get_handle();

	return 0;
}

int WaitableCollection::add(const WaitableCollection & z)
{
	if(size+z.size>MAXIMUM_WAIT_OBJECTS)
		return 1;

    for (int i = 0; i < z.size; i++) 
		handles[size++] = z.handles[i];

	return 0;
}  

void wait(DWORD milliseconds)
{
	::Sleep(milliseconds);
}

DWORD wait(const WaitableObject& z,DWORD milliseconds)
{
	return ::WaitForSingleObject(z.get_handle(),milliseconds);
}

DWORD wait(const WaitableCollection& z, BOOL bWaitAll, DWORD milliseconds)
{
    
    if (z.size == 0) 
        return WAIT_FAILED;
    
    return ::WaitForMultipleObjects( z.size, z.handles, bWaitAll, milliseconds);
}

void wait_APC(DWORD milliseconds,BOOL ignore_APC)
{
	::SleepEx(milliseconds,! ignore_APC);
}

DWORD wait_APC(const WaitableObject& z,DWORD milliseconds,BOOL ignore_APC)
{
	return WaitForSingleObjectEx(z.get_handle(),milliseconds,! ignore_APC);
}

DWORD wait_APC(const WaitableCollection& z, BOOL bWaitAll, DWORD milliseconds,BOOL ignore_APC)
{
    
    if (z.size == 0) 
        return WAIT_FAILED;
    
    return ::WaitForMultipleObjectsEx( z.size, z.handles, bWaitAll, milliseconds,! ignore_APC);
}