static bool is_himddevice(QString devID, QString & name) { DEVINST devinst; DEVINST devinstparent; unsigned long buflen; QString recname, devicepath; CM_Locate_DevNodeA(&devinst, devID.toLatin1().data(), NULL); CM_Get_Parent(&devinstparent, devinst, NULL); if(devID.contains("RemovableMedia", Qt::CaseInsensitive)) // on Windows XP: get next parent device instance CM_Get_Parent(&devinstparent, devinstparent, NULL); CM_Get_Device_ID_Size(&buflen, devinstparent, 0); wchar_t *buffer = new wchar_t[buflen]; CM_Get_Device_ID(devinstparent, buffer, buflen, 0); devicepath = QString::fromWCharArray(buffer); delete[] buffer; if(identified( devicepath, recname)) { name = recname; return true; } return false; }
int main () { zmq::context_t context(1); // First allow 0MQ to set the identity zmq::socket_t sink(context, ZMQ_XREP); sink.bind( "inproc://example"); zmq::socket_t anonymous(context, ZMQ_REQ); anonymous.connect( "inproc://example"); s_send (anonymous, "XREP uses a generated UUID"); s_dump (sink); zmq::socket_t identified (context, ZMQ_REQ); identified.setsockopt( ZMQ_IDENTITY, "Hello", 5); identified.connect( "inproc://example"); s_send (identified, "XREP socket uses REQ's socket identity"); s_dump (sink); return 0; }
bool QHiMDWinDetection::winEvent(MSG * msg, long * result) { QString name, devID, path ; if(msg->message == WM_DEVICECHANGE) { PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR )msg->lParam; switch(msg->wParam) { case DBT_DEVICEARRIVAL : { if(pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME pHdrv = (PDEV_BROADCAST_VOLUME)pHdr; path = FindPath(pHdrv->dbcv_unitmask); devID = get_deviceID_from_driveletter(path.at(0).toLatin1()); if(!devID.isEmpty()) { if(is_himddevice(devID, name)) { qDebug() << "Message:DBT_DEVICEARRIVAL for drive " + path; add_himddevice(path, name); } } } else if(pHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr; devID = QString::fromWCharArray(pDevInf->dbcc_name).toUpper(); /* only handle netmd devices, himd devices will be handled by DBT_DEVTYP_VOLUME */ if(identified(devID, name) && name.contains("NetMD)")) { qDebug() << name << " detected, rescanning netmd devices" << endl; rescan_netmd_devices(); } } break; } case DBT_DEVICEREMOVECOMPLETE : { if(pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME pHdrv = (PDEV_BROADCAST_VOLUME)pHdr; path = FindPath(pHdrv->dbcv_unitmask); qDebug() << "Message:DBT_DEVICEREMOVECOMPLETE for drive " + path; remove_himddevice(path); } else if(pHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr; devID = QString::fromWCharArray(pDevInf->dbcc_name).toUpper(); if(identified(devID, name) && name.contains("NetMD)")) { qDebug() << name << " removed, rescanning netmd devices" << endl; rescan_netmd_devices(); } } break; } case DBT_DEVICEQUERYREMOVE : { if(pHdr->dbch_devicetype & DBT_DEVTYP_HANDLE) { PDEV_BROADCAST_HANDLE pHdrh = (PDEV_BROADCAST_HANDLE)pHdr; QMDDevice *dev = find_by_handle(pHdrh->dbch_handle); if(!dev) { qDebug() << "Message:DBT_DEVICEQUERYREMOVE for unknown device " << pHdrh->dbch_handle; break; } if(dev->isBusy()) { *result = BROADCAST_QUERY_DENY; qDebug() << "Message:DBT_DEVICEQUERYREMOVE for drive " + path + " denied: transfer in progress"; return true; } else { qDebug() << "Message:DBT_DEVICEQUERYREMOVE requested"; remove_himddevice(dev->path()); } } else if(pHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr; devID = QString::fromWCharArray(pDevInf->dbcc_name).toUpper(); if(identified(devID, name) && name.contains("NetMD)")) { QMDDevice * dev = find_by_name(name); if(!dev) break; if(dev->isBusy()) { *result = BROADCAST_QUERY_DENY; return true; } dev->close(); } } break; } case my_DBT_CUSTOMEVENT : { if(pHdr->dbch_devicetype & DBT_DEVTYP_HANDLE) { PDEV_BROADCAST_HANDLE pHdrh = (PDEV_BROADCAST_HANDLE)pHdr; if (pHdrh->dbch_eventguid == my_GUID_IO_MEDIA_ARRIVAL) { qDebug() << "Message:DBT_CUSTOMEVENT - GUID_IO_MEDIA_ARRIVAL"; add_himd(pHdrh->dbch_handle); break; } if (pHdrh->dbch_eventguid == my_GUID_IO_MEDIA_REMOVAL) { qDebug() << "Message:DBT_CUSTOMEVENT - GUID_IO_MEDIA_REMOVAL"; remove_himd(pHdrh->dbch_handle); break; } } break; } default: return false; // skip unknown/unused messages } *result = TRUE; return true; } return false; }