summaryrefslogblamecommitdiffstats
path: root/Src/devices/discoveryMonitor.cpp
blob: 3a42bd08271b00b8d95aeefc53e14e58717b3308 (plain) (tree)








































































































                                                                                 
#include "main.h"
#include "./discoveryMonitor.h"

DiscoveryMonitor::DiscoveryMonitor()
{
	InitializeCriticalSection(&lock);
}

DiscoveryMonitor::~DiscoveryMonitor()
{
	DeleteCriticalSection(&lock);
}

void DiscoveryMonitor::Lock()
{
	EnterCriticalSection(&lock);
}

void DiscoveryMonitor::Unlock()
{
	LeaveCriticalSection(&lock);
}

BOOL DiscoveryMonitor::Register(ifc_deviceprovider *provider)
{
	Lock();

	size_t index = activityList.size();
	while(index--)
	{
		ActiveDiscovery *entry = &activityList[index];
		if ((intptr_t)provider == entry->providerId)
		{
			entry->ref++;
			Unlock();
			return FALSE;
		}
	}

	ActiveDiscovery record;
	record.providerId = (intptr_t)provider;
	record.ref = 1;

	activityList.push_back(record);
	index = activityList.size();

	Unlock();
	return (1 == index);
}

BOOL DiscoveryMonitor::Unregister(ifc_deviceprovider *provider)
{
	Lock();

	size_t index = activityList.size();
	while(index--)
	{
		ActiveDiscovery *entry = &activityList[index];
		if ((intptr_t)provider == entry->providerId)
		{
			if (1 == entry->ref)
			{
				activityList.erase(activityList.begin() + index);
				index = activityList.size();
				Unlock();
				return (0 == index);
			}

			entry->ref--;
			break;
		}
	}

	Unlock();
	return FALSE;
}

BOOL DiscoveryMonitor::IsActive()
{
	size_t count;

	Lock();

	count = activityList.size();

	Unlock();

	return (0 != count);
}

BOOL DiscoveryMonitor::Reset()
{
	size_t count;

	Lock();

	count = activityList.size();
	activityList.clear();

	Unlock();

	return (0 != count);
}