Пример #1
0
VOID
CNdasDevice::ChangeStatus(NDAS_DEVICE_STATUS newStatus)
{
	ximeta::CAutoLock autolock(this);

	if (m_status == newStatus) {
		return;
	}

	NDAS_DEVICE_STATUS oldStatus = m_status;

	//
	// clear failure count for every status change
	//
	m_dwCommFailureCount = 0;

	switch (newStatus) {
	case NDAS_DEVICE_STATUS_DISABLED:
		{
			pGetNdasDeviceHeartbeatListner()->Detach(this);
			pGetNdasEventMonitor()->Detach(this);
			DestroyAllUnitDevices();
		}
		break;
	case NDAS_DEVICE_STATUS_CONNECTED:
		{
			pGetNdasEventMonitor()->Attach(this);
		}
		break;
	case NDAS_DEVICE_STATUS_DISCONNECTED:
		{
			//
			// Detaching from the Monitor will be done at OnStatusCheck
			// by returning TRUE to detach this device from the monitor
			//
			pGetNdasDeviceHeartbeatListner()->Attach(this);
			DestroyAllUnitDevices();
		}
		break;
	default:
		_ASSERTE(FALSE);
	}

	DBGPRT_INFO(_FT("%s status changed %s to %s\n"),
		ToString(),
		NdasDeviceStatusString(m_status),
		NdasDeviceStatusString(newStatus));

	m_status = newStatus;

	(VOID) pGetNdasEventPublisher()->
		DeviceStatusChanged(m_dwSlotNo, oldStatus, newStatus);

	return;
}
Пример #2
0
DWORD 
CNdasAutoRegister::OnTaskStart()
{
	_ASSERTE(NULL != m_hSemQueue && "Don't forget to call initialize().");

	// Queue Semaphore, Terminating Thread, Pipe Instances(MAX...)
	HANDLE hWaitHandles[2];
	hWaitHandles[0] = m_hTaskTerminateEvent;
	hWaitHandles[1] = m_hSemQueue;

	CNdasDeviceHeartbeatListener* pListener = 
		pGetNdasDeviceHeartbeatListner();

	pListener->Attach(this);

	do {

		DWORD dwWaitResult = ::WaitForMultipleObjects(
			2, hWaitHandles, 
			FALSE, INFINITE);

		if (WAIT_OBJECT_0 == dwWaitResult) {

			break;

		} else if (WAIT_OBJECT_0 + 1 == dwWaitResult) {

			while (TRUE) {
				m_queueLock.Lock();
				if (m_queue.empty()) {
					m_queueLock.Unlock();
					break;
				}
				QUEUE_ENTRY entry = m_queue.front();
				m_queue.pop();
				m_queueLock.Unlock();
				(VOID) ProcessRegister(entry.deviceID, entry.access);
			}


		} else {

			_ASSERTE(FALSE);
			// ERROR
		}

	} while (TRUE);

	pListener->Detach(this);

	return 0;
}
Пример #3
0
VOID 
CNdasAutoRegister::Update(ximeta::CSubject* pChangedSubject)
{

	CNdasDeviceHeartbeatListener* pListener = 
		pGetNdasDeviceHeartbeatListner();

	//
	// Ignore other than subscribed heartbeat listener
	//

	if (pListener == pChangedSubject) {

		NDAS_DEVICE_HEARTBEAT_DATA hbData;

		pListener->GetHeartbeatData(&hbData);

		NDAS_DEVICE_ID deviceId = {0};
		::CopyMemory(&deviceId, hbData.remoteAddr.Node, sizeof(deviceId));

		ACCESS_MASK autoRegAccess = m_data.GetAutoRegAccess(deviceId);
		if (!autoRegAccess) {
			return;
		}

		//
		// If already registered, do nothing
		//
		CRefObjPtr<CNdasDevice> pDevice = pGetNdasDevice(deviceId);
		if (NULL != pDevice.p) {
			return;
		}

		::NdasLogEventInformation(
			EVT_NDASSVC_INFO_AUTOREG_NDAS_DEVICE_FOUND,
			NULL, 
			0, 
			sizeof(deviceId), 
			NULL, 
			&deviceId);
		
		(VOID) AddToQueue(deviceId, autoRegAccess);
	}
}
Пример #4
0
void 
CNdasDevice::Update(ximeta::CSubject* pChangedSubject)
{
	ximeta::CAutoLock autolock(this);

	CNdasDeviceHeartbeatListener* pListener = pGetNdasDeviceHeartbeatListner();

	//
	// Ignore other than subscribed heartbeat listener
	//
	if (pListener == pChangedSubject) 
	{

		NDAS_DEVICE_HEARTBEAT_DATA hbData;

		pListener->GetHeartbeatData(&hbData);

		//
		// matching device id (address) only
		//
		// LPX_ADDRESS and NDAS_DEVICE_ID are different type
		// so we cannot merely use CompareLpxAddress function here
		//
		if (0 == ::memcmp(
			hbData.remoteAddr.Node, 
			m_deviceId.Node, 
			sizeof(m_deviceId.Node[0]) * 6))
		{
			OnDiscovered(
				hbData.localAddr,
				hbData.remoteAddr,
				hbData.ucType,
				hbData.ucVersion);
		}

	}
	
}