in wpd/WpdMultiTransportDriver/WpdObjectProperties.cpp [782:1283]
HRESULT WpdObjectProperties::GetPropertyValuesForObject(
_In_ LPCWSTR wszObjectID,
_In_ IPortableDeviceKeyCollection* pKeys,
_In_ IPortableDeviceValues* pValues)
{
HRESULT hr = S_OK;
CAtlStringW strObjectID = wszObjectID;
DWORD cKeys = 0;
if ((wszObjectID == NULL) ||
(pKeys == NULL) ||
(pValues == NULL))
{
hr = E_INVALIDARG;
return hr;
}
hr = pKeys->GetCount(&cKeys);
CHECK_HR(hr, "Failed to number of PROPERTYKEYs in collection");
if (hr == S_OK)
{
// Get values for the DEVICE object
if (strObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
{
for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
{
PROPERTYKEY Key = WPD_PROPERTY_NULL;
hr = pKeys->GetAt(dwIndex, &Key);
CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
if (hr == S_OK)
{
// Preset the property value to 'error not supported'. The actual value
// will replace this value, if read from the device.
pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
// Set DEVICE object properties
if (IsEqualPropertyKey(Key, WPD_DEVICE_FIRMWARE_VERSION))
{
hr = pValues->SetStringValue(WPD_DEVICE_FIRMWARE_VERSION, DEVICE_FIRMWARE_VERSION_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_FIRMWARE_VERSION");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_POWER_LEVEL))
{
hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_LEVEL, DEVICE_POWER_LEVEL_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_POWER_LEVEL");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_POWER_SOURCE))
{
hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_SOURCE, WPD_POWER_SOURCE_EXTERNAL);
CHECK_HR(hr, "Failed to set WPD_DEVICE_POWER_SOURCE");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_PROTOCOL))
{
hr = pValues->SetStringValue(WPD_DEVICE_PROTOCOL, DEVICE_PROTOCOL_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_PROTOCOL");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_MODEL))
{
hr = pValues->SetStringValue(WPD_DEVICE_MODEL, DEVICE_MODEL_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_MODEL");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_SERIAL_NUMBER))
{
hr = pValues->SetStringValue(WPD_DEVICE_SERIAL_NUMBER, DEVICE_SERIAL_NUMBER_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_SERIAL_NUMBER");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_SUPPORTS_NON_CONSUMABLE))
{
hr = pValues->SetBoolValue(WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, DEVICE_SUPPORTS_NONCONSUMABLE_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_SUPPORTS_NON_CONSUMABLE");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_MANUFACTURER))
{
hr = pValues->SetStringValue(WPD_DEVICE_MANUFACTURER, DEVICE_MANUFACTURER_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_MANUFACTURER");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_FRIENDLY_NAME))
{
hr = pValues->SetStringValue(WPD_DEVICE_FRIENDLY_NAME, DEVICE_FRIENDLY_NAME_VALUE);
CHECK_HR(hr, "Failed to set WPD_DEVICE_FRIENDLY_NAME");
}
if (IsEqualPropertyKey(Key, WPD_DEVICE_TYPE))
{
hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_TYPE, WPD_DEVICE_TYPE_GENERIC);
CHECK_HR(hr, "Failed to set WPD_DEVICE_TYPE");
}
// Set general properties for DEVICE
if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_ID, WPD_DEVICE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
{
hr = pValues->SetStringValue(WPD_OBJECT_NAME, WPD_DEVICE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, WPD_DEVICE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, L"");
CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
{
hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
{
hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
{
hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
}
if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
{
hr = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_DEVICE);
CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
}
}
}
}
else if (strObjectID.CompareNoCase(STORAGE_OBJECT_ID) == 0)
{
for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
{
PROPERTYKEY Key = WPD_PROPERTY_NULL;
hr = pKeys->GetAt(dwIndex, &Key);
CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
if (hr == S_OK)
{
// Preset the property value to 'error not supported'. The actual value
// will replace this value, if read from the device.
pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
// Set storage object properties
if (IsEqualPropertyKey(Key, WPD_STORAGE_SERIAL_NUMBER))
{
hr = pValues->SetStringValue(WPD_STORAGE_SERIAL_NUMBER, STORAGE_SERIAL_NUMBER_VALUE);
CHECK_HR(hr, "Failed to set WPD_STORAGE_SERIAL_NUMBER");
}
if (IsEqualPropertyKey(Key, WPD_STORAGE_FREE_SPACE_IN_BYTES))
{
hr = pValues->SetUnsignedLargeIntegerValue(WPD_STORAGE_FREE_SPACE_IN_BYTES, (STORAGE_FREE_SPACE_IN_BYTES_VALUE - GetObjectSize(README_FILE_OBJECT_ID)));
CHECK_HR(hr, "Failed to set WPD_STORAGE_FREE_SPACE_IN_BYTES");
}
if (IsEqualPropertyKey(Key, WPD_STORAGE_CAPACITY))
{
hr = pValues->SetUnsignedLargeIntegerValue(WPD_STORAGE_CAPACITY, STORAGE_CAPACITY_VALUE);
CHECK_HR(hr, "Failed to set WPD_STORAGE_CAPACITY");
}
if (IsEqualPropertyKey(Key, WPD_STORAGE_TYPE))
{
hr = pValues->SetUnsignedIntegerValue(WPD_STORAGE_TYPE, WPD_STORAGE_TYPE_FIXED_ROM);
CHECK_HR(hr, "Failed to set WPD_STORAGE_TYPE");
}
// Set general properties for storage
if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_ID, STORAGE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
{
hr = pValues->SetStringValue(WPD_OBJECT_NAME, STORAGE_OBJECT_NAME_VALUE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, STORAGE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, WPD_DEVICE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
{
hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
{
hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
{
hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
}
if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
{
hr = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_STORAGE);
CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
}
if (IsEqualPropertyKey(Key, WPD_STORAGE_FILE_SYSTEM_TYPE))
{
hr = pValues->SetStringValue(WPD_STORAGE_FILE_SYSTEM_TYPE, STORAGE_FILE_SYSTEM_TYPE_VALUE);
CHECK_HR(hr, "Failed to set WPD_STORAGE_FILE_SYSTEM_TYPE");
}
if (IsEqualPropertyKey(Key, WPD_STORAGE_DESCRIPTION))
{
hr = pValues->SetStringValue(WPD_STORAGE_DESCRIPTION, STORAGE_DESCRIPTION_VALUE);
CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION");
}
}
}
}
else if (strObjectID.CompareNoCase(DOCUMENTS_FOLDER_OBJECT_ID) == 0)
{
for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
{
PROPERTYKEY Key = WPD_PROPERTY_NULL;
hr = pKeys->GetAt(dwIndex, &Key);
CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
if (hr == S_OK)
{
// Preset the property value to 'error not supported'. The actual value
// will replace this value, if read from the device.
pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
// Set general properties for the folder object
if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_ID, DOCUMENTS_FOLDER_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, DOCUMENTS_FOLDER_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, STORAGE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
{
hr = pValues->SetStringValue(WPD_OBJECT_NAME, DOCUMENTS_FOLDER_OBJECT_NAME_VALUE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_ORIGINAL_FILE_NAME))
{
hr = pValues->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, DOCUMENTS_FOLDER_OBJECT_ORIGINAL_FILE_NAME_VALUE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_ORIGINAL_FILE_NAME");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
{
hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
{
hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FOLDER);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
{
hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_MODIFIED))
{
PROPVARIANT pvDateModified = {0};
SYSTEMTIME systemtime = {0};
systemtime.wMonth = 6;
systemtime.wDay = 26;
systemtime.wYear = 2006;
systemtime.wHour = 5;
// Initialize the Date Modified PROPVARIANT value
PropVariantInit(&pvDateModified);
pvDateModified.vt = VT_DATE;
if (SystemTimeToVariantTime(&systemtime, &pvDateModified.date) == TRUE)
{
hr = pValues->SetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_MODIFIED");
}
else
{
LONG lError = GetLastError();
hr = HRESULT_FROM_WIN32(lError);
}
PropVariantClear(&pvDateModified);
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_CREATED))
{
PROPVARIANT pvDateCreated = {0};
SYSTEMTIME systemtime = {0};
systemtime.wMonth = 1;
systemtime.wDay = 24;
systemtime.wYear = 2006;
systemtime.wHour = 12;
// Initialize the Date Created PROPVARIANT value
PropVariantInit(&pvDateCreated);
pvDateCreated.vt = VT_DATE;
if (SystemTimeToVariantTime(&systemtime, &pvDateCreated.date) == TRUE)
{
hr = pValues->SetValue(WPD_OBJECT_DATE_CREATED, &pvDateCreated);
CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_CREATED");
}
else
{
LONG lError = GetLastError();
hr = HRESULT_FROM_WIN32(lError);
}
PropVariantClear(&pvDateCreated);
}
}
}
}
else if (strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
{
for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
{
PROPERTYKEY Key = WPD_PROPERTY_NULL;
hr = pKeys->GetAt(dwIndex, &Key);
CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
if (hr == S_OK)
{
// Preset the property value to 'error not supported'. The actual value
// will replace this value, if read from the device.
pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_ID, README_FILE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, README_FILE_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
{
hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, DOCUMENTS_FOLDER_OBJECT_ID);
CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
{
hr = pValues->SetStringValue(WPD_OBJECT_NAME, README_FILE_OBJECT_NAME_VALUE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_ORIGINAL_FILE_NAME))
{
hr = pValues->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, README_FILE_OBJECT_ORIGINAL_FILE_NAME_VALUE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_ORIGINAL_FILE_NAME");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
{
hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, GetObjectFormat(strObjectID));
CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
{
hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, GetObjectContentType(strObjectID));
CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
{
hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_SIZE))
{
hr = pValues->SetUnsignedLargeIntegerValue(WPD_OBJECT_SIZE, GetObjectSize(strObjectID));
CHECK_HR(hr, "Failed to set WPD_OBJECT_SIZE");
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_MODIFIED))
{
PROPVARIANT pvDateModified = {0};
SYSTEMTIME systemtime = {0};
systemtime.wMonth = 6;
systemtime.wDay = 26;
systemtime.wYear = 2006;
systemtime.wHour = 5;
// Initialize the Date Modified PROPVARIANT value
PropVariantInit(&pvDateModified);
pvDateModified.vt = VT_DATE;
if (SystemTimeToVariantTime(&systemtime, &pvDateModified.date) == TRUE)
{
hr = pValues->SetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_MODIFIED");
}
else
{
LONG lError = GetLastError();
hr = HRESULT_FROM_WIN32(lError);
}
PropVariantClear(&pvDateModified);
}
if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_CREATED))
{
PROPVARIANT pvDateCreated = {0};
SYSTEMTIME systemtime = {0};
systemtime.wMonth = 1;
systemtime.wDay = 24;
systemtime.wYear = 2006;
systemtime.wHour = 12;
// Initialize the Date Created PROPVARIANT value
PropVariantInit(&pvDateCreated);
pvDateCreated.vt = VT_DATE;
if (SystemTimeToVariantTime(&systemtime, &pvDateCreated.date) == TRUE)
{
hr = pValues->SetValue(WPD_OBJECT_DATE_CREATED, &pvDateCreated);
CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_CREATED");
}
else
{
LONG lError = GetLastError();
hr = HRESULT_FROM_WIN32(lError);
}
PropVariantClear(&pvDateCreated);
}
}
}
}
}
return hr;
}