Пример #1
0
// new DeviceInfo object, transfers ownership of strings, 
DeviceInfo *DeviceInfo::NewDevice(enum DevType aDevType, 
    enum DevState aDevState, FILETIME aNow, wchar_t *aSerialnumber, wchar_t *aPortName,
    wchar_t *aFriendlyName, wchar_t *aHardwareId, int aPortNumber, wchar_t *aContainerId,
    unsigned aUsbHub, unsigned aUsbPort, BOOL aUsbValid, unsigned aScanId, DeviceInfo *aDevNext,
    BOOL aIsWinSerial, SerialType aSerialType)
{
    DeviceInfo *newDev = NULL;

    // decide if new device should be DevArrived rather than DevPresent
    if ((aDevState == DevPresent) && !gdevTracker->CheckInitialScanFlag(aDevType)) {
        aDevState = DevArrived;
    }

    newDev = new DeviceInfo(aDevType, aDevState, aNow, aSerialnumber, aPortName,
        aPortNumber, aContainerId, aFriendlyName, aHardwareId,
        aUsbHub, aUsbPort, aUsbValid, aScanId, aDevNext,
        aIsWinSerial, aSerialType);

    if (newDev) {
        TCHAR   buffer[20];

        // update double linked list
        if (aDevNext) {
            aDevNext->devPrev = newDev;
        }
        gdevTracker->SetPortList(newDev);

        StringCbPrintf(buffer, sizeof(buffer), 
            (newDev->DeviceState() == DevArrived) ? _T("%s 0min") : _T("%s"), newDev->StateName());

        // display update shouldn't fail, but check anyway
        if (!gdevTracker->AddViewItem(newDev->DisplayName(), newDev->devImage,
                newDev->DevTypeName(), buffer, newDev->LocationString(), aSerialnumber,
                (LPARAM)newDev)) {
            newDev->Destroy();
            newDev = NULL;
        } else {
            if ((aDevState == DevArrived) || (aDevState == DevPresent)) {
                // update count
                newDev->IncDeviceTypeCount();
            }

            // update DeviceTracker counts, decide on notifications 
            gdevTracker->DetermineArrivalNotifications(aDevType, aDevState);
        }
    }

    return newDev;
}