[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 07/20] Track a single device in the service.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/liteagent/DeviceList.cpp | 9 +++++++++ src/liteagent/DeviceList.h | 4 ++++ src/liteagent/LiteAgent.cpp | 21 ++++++++++++++++++++- src/liteagent/LiteAgent.h | 3 +++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/liteagent/DeviceList.cpp b/src/liteagent/DeviceList.cpp index 1cb3bf6..9033407 100644 --- a/src/liteagent/DeviceList.cpp +++ b/src/liteagent/DeviceList.cpp @@ -96,6 +96,11 @@ void CDevice::Close() m_handle = INVALID_HANDLE_VALUE; } +const wchar_t* CDevice::Path() const +{ + return m_path.c_str(); +} + bool CDevice::Ioctl(DWORD ioctl, void* in, DWORD insz, void* out, DWORD outsz, DWORD* bytes) { if (m_handle == INVALID_HANDLE_VALUE) @@ -255,6 +260,8 @@ void CDeviceList::OnDeviceAdded(const std::wstring& path) } m_devs[handle] = dev; + if (m_impl) + m_impl->OnDeviceAdded(dev); } void CDeviceList::OnDeviceQueryRemove(HANDLE handle) @@ -264,6 +271,8 @@ void CDeviceList::OnDeviceQueryRemove(HANDLE handle) return; // spurious event? CDevice* dev = it->second; + if (m_impl) + m_impl->OnDeviceRemoved(dev); dev->Close(); } diff --git a/src/liteagent/DeviceList.h b/src/liteagent/DeviceList.h index 10df546..457a099 100644 --- a/src/liteagent/DeviceList.h +++ b/src/liteagent/DeviceList.h @@ -46,6 +46,8 @@ public: HANDLE Open(HANDLE svc); void Close(); + const wchar_t* Path() const; + protected: bool Ioctl(DWORD ioctl, void* in, DWORD insz, void* out, DWORD outsz, DWORD* bytes); @@ -58,6 +60,8 @@ private: interface IDeviceCreator { virtual CDevice* Create(const wchar_t* path) = 0; + virtual void OnDeviceAdded(CDevice* dev) = 0; + virtual void OnDeviceRemoved(CDevice* dev) = 0; }; class CDeviceList diff --git a/src/liteagent/LiteAgent.cpp b/src/liteagent/LiteAgent.cpp index 1eec87e..a7987dc 100644 --- a/src/liteagent/LiteAgent.cpp +++ b/src/liteagent/LiteAgent.cpp @@ -116,7 +116,7 @@ static CLiteAgent s_service; return s_service.__ServiceControlHandlerEx(req, evt, data, ctxt); } -CLiteAgent::CLiteAgent() : m_handle(NULL), m_devs(GUID_INTERFACE_XENIFACE) +CLiteAgent::CLiteAgent() : m_handle(NULL), m_devs(GUID_INTERFACE_XENIFACE), m_dev(NULL) { m_status.dwServiceType = SERVICE_WIN32; m_status.dwCurrentState = SERVICE_START_PENDING; @@ -136,9 +136,28 @@ CLiteAgent::~CLiteAgent() /*virtual*/ CDevice* CLiteAgent::Create(const wchar_t* path) { + // create subclass of CDevice return new CDevice(path); } +/*virtual*/ void CLiteAgent::OnDeviceAdded(CDevice* dev) +{ + CLiteAgent::Log("OnDeviceAdded(%ws)\n", dev->Path()); + if (m_dev == NULL) { + m_dev = dev; + // setting active device + } +} + +/*virtual*/ void CLiteAgent::OnDeviceRemoved(CDevice* dev) +{ + CLiteAgent::Log("OnDeviceRemoved(%ws)\n", dev->Path()); + if (dev == m_dev) { + m_dev = NULL; + // active device + } +} + void CLiteAgent::OnServiceStart() { CLiteAgent::Log("OnServiceStart()\n"); diff --git a/src/liteagent/LiteAgent.h b/src/liteagent/LiteAgent.h index 57ed9e7..261e737 100644 --- a/src/liteagent/LiteAgent.h +++ b/src/liteagent/LiteAgent.h @@ -58,6 +58,8 @@ public: // ctor/dtor public: // IDeviceCreator virtual CDevice* Create(const wchar_t* path); + virtual void OnDeviceAdded(CDevice* dev); + virtual void OnDeviceRemoved(CDevice* dev); private: // service events void OnServiceStart(); @@ -75,6 +77,7 @@ private: // service support HANDLE m_svc_stop; CDeviceList m_devs; + CDevice* m_dev; }; #endif -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |