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; }
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; }
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); } }
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); } } }