// // Microsoft Windows Media Technologies // Copyright (C) Microsoft Corporation, 1999 - 2001. All rights reserved. // // // This workspace contains two projects - // 1. ProgHelp which implements the Progress Interface // 2. The Sample application WmdmApp. // // ProgHelp.dll needs to be registered first for the SampleApp to run. // Includes // #include "appPCH.h" // Update serial id in device/storage dialog void UpdateSerialId( HWND hDlg, CItemData* pDevice ) { char* pszSerial; char* pszSerialStep; int iMaxStringLength; BOOL bSerialIsString = TRUE; // Should we also show the serial id as a string? if( pDevice == NULL || hDlg == 0 ) return; // No serial ? if( pDevice->m_SerialNumber.SerialNumberLength == 0 ) { SetDlgItemText( hDlg, IDC_SERIALID, "" ); return; } // Get serial # of device as a string iMaxStringLength = pDevice->m_SerialNumber.SerialNumberLength * sizeof("FF ") +1; pszSerial = new char[iMaxStringLength]; pszSerialStep = pszSerial; for( UINT uIndex = 0; uIndex < pDevice->m_SerialNumber.SerialNumberLength; uIndex ++ ) { // Add one byte at the time to the serial id string pszSerialStep += wsprintf( pszSerialStep, "%X ", pDevice->m_SerialNumber.pID[uIndex] ); if( !isprint( pDevice->m_SerialNumber.pID[uIndex] ) ) { bSerialIsString = FALSE; } } SetDlgItemText( hDlg, IDC_SERIALID, pszSerial ); // If the serial id is a string show it as a string if( bSerialIsString && (pDevice->m_SerialNumber.SerialNumberLength > 0) ) { SetDlgItemText( hDlg, IDC_SERIALID_STRING, (char*)pDevice->m_SerialNumber.pID ); } delete [] pszSerial; } // Update manufacturer value in device dialog void UpdateManufacturer( HWND hDlg, CItemData* pDevice ) { SetDlgItemText( hDlg, IDC_MANUFACTURER, pDevice->m_szMfr ); } // Update device type value in device dialog void UpdateDeviceType( HWND hDlg, CItemData* pDevice ) { char pszType[MAX_PATH]; static SType_String sDeviceTypeStringArray[] = { { WMDM_DEVICE_TYPE_PLAYBACK, "Playback" }, { WMDM_DEVICE_TYPE_RECORD, "Record" }, { WMDM_DEVICE_TYPE_DECODE, "Decode" }, { WMDM_DEVICE_TYPE_ENCODE, "Encode" }, { WMDM_DEVICE_TYPE_STORAGE, "Storage" }, { WMDM_DEVICE_TYPE_VIRTUAL, "Virtual" }, { WMDM_DEVICE_TYPE_SDMI, "Sdmi" }, { WMDM_DEVICE_TYPE_NONSDMI, "non-sdmi" }, { 0, NULL }, }; // Add all the types reported by the device to the string. pszType[0] = '\0'; for( int iIndex = 0; sDeviceTypeStringArray[iIndex].dwType != 0; iIndex++ ) { // Is this bit set, if it is then add the type as a string if( sDeviceTypeStringArray[iIndex].dwType & pDevice->m_dwType ) { if( strlen(pszType) ) { strcat( pszType, ", " ); } strcat( pszType, sDeviceTypeStringArray[iIndex].pszString ); } } SetDlgItemText( hDlg, IDC_DEVICE_TYPE, ((strlen(pszType)) ? pszType : "") ); } // Update icon in device dialog void UpdateDeviceIcon( HWND hDlg, CItemData* pDevice ) { HICON hIcon; hIcon = LoadIcon( g_hInst, MAKEINTRESOURCE( IDI_DEVICE ) ); ::SendMessage(hDlg, WM_SETICON, FALSE, (LPARAM)hIcon ); } // Update status property in device/storage dialog box void UpdateStatus( HWND hDlg, CItemData* pDevice ) { char pszStatus[MAX_PATH]; static SType_String sDeviceTypeStringArray[] = { { WMDM_STATUS_READY , "Ready" }, { WMDM_STATUS_BUSY , "Busy" }, { WMDM_STATUS_DEVICE_NOTPRESENT , "Device not present" }, { WMDM_STATUS_STORAGE_NOTPRESENT , "Storage not present" }, { WMDM_STATUS_STORAGE_INITIALIZING , "Storage initializing" }, { WMDM_STATUS_STORAGE_BROKEN , "Storage broken" }, { WMDM_STATUS_STORAGE_NOTSUPPORTED , "Storage not supported" }, { WMDM_STATUS_STORAGE_UNFORMATTED , "Storage unformatted" }, { WMDM_STATUS_STORAGECONTROL_INSERTING, "Storagecontrol inserting" }, { WMDM_STATUS_STORAGECONTROL_DELETING , "Storagecontrol deleting" }, { WMDM_STATUS_STORAGECONTROL_MOVING , "Storagecontrol moving" }, { WMDM_STATUS_STORAGECONTROL_READING , "Storagecontrol reading" }, { 0, NULL }, }; // Add all the types reported by the device to the string. pszStatus[0] = '\0'; for( int iIndex = 0; sDeviceTypeStringArray[iIndex].dwType != 0; iIndex++ ) { // Is this bit set, if it is then add the type as a string if( sDeviceTypeStringArray[iIndex].dwType & pDevice->m_dwType ) { if( strlen(pszStatus) ) { strcat( pszStatus, ", " ); } strcat( pszStatus, sDeviceTypeStringArray[iIndex].pszString ); } } SetDlgItemText( hDlg, IDC_DEVICE_STATUS, ((strlen(pszStatus)) ? pszStatus : "") ); } // Update device status property in device dialog box void UpdateDeviceVersion( HWND hDlg, CItemData* pDevice ) { if( pDevice->m_dwVersion == (DWORD)-1 ) { SetDlgItemText( hDlg, IDC_VERSION, ""); } else { SetDlgItemInt( hDlg, IDC_VERSION, pDevice->m_dwVersion, FALSE ); } } // Update device status property in device dialog box void UpdatePowerSource( HWND hDlg, CItemData* pDevice ) { char pszPowerSource[MAX_PATH]; char pszPowerIs[MAX_PATH]; // Update capabileties if( (pDevice->m_dwPowerSource & WMDM_POWER_CAP_BATTERY) && (pDevice->m_dwPowerSource & WMDM_POWER_CAP_EXTERNAL) ) { SetDlgItemText( hDlg, IDC_POWER_CAP, "Bateries and external"); } else if(pDevice->m_dwPowerSource & WMDM_POWER_CAP_BATTERY) { SetDlgItemText( hDlg, IDC_POWER_CAP, "Bateries"); } else if(pDevice->m_dwPowerSource & WMDM_POWER_CAP_EXTERNAL) { SetDlgItemText( hDlg, IDC_POWER_CAP, "External"); } else { SetDlgItemText( hDlg, IDC_POWER_CAP, ""); } // Update current power source string if( (pDevice->m_dwPowerSource & WMDM_POWER_CAP_BATTERY) && (pDevice->m_dwPowerSource & WMDM_POWER_CAP_EXTERNAL) ) { strcpy( pszPowerSource, "Bateries and external"); } else if(pDevice->m_dwPowerSource & WMDM_POWER_CAP_BATTERY) { strcpy( pszPowerSource, "Bateries"); } else if(pDevice->m_dwPowerSource & WMDM_POWER_CAP_EXTERNAL) { strcpy( pszPowerSource, "External"); } else { strcpy( pszPowerSource, ""); } wsprintf( pszPowerIs, "%s (%d%% remaning)", pszPowerSource, pDevice->m_dwPercentRemaining ); SetDlgItemText( hDlg, IDC_POWER_IS, pszPowerIs ); } // Update dialog caption void UpdateCaption( HWND hDlg, CItemData* pDevice ) { char pszWndCaption[2*MAX_PATH]; char pszFormat[MAX_PATH]; // Set window caption LoadString( g_hInst, IDS_PROPERTIES_CAPTION, pszFormat, sizeof(pszFormat) ); if (SUCCEEDED(StringCbPrintf(pszWndCaption, sizeof(pszWndCaption), pszFormat, pDevice->m_szName))) { SetWindowText( hDlg, pszWndCaption ); } } // Procedure for device property dialog box INT_PTR CALLBACK DeviceProp_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { CItemData* pItem = (CItemData*)lParam; if( pItem == NULL ) return FALSE; UpdateSerialId( hDlg, pItem ); UpdateManufacturer( hDlg, pItem ); UpdateDeviceType( hDlg, pItem ); UpdateDeviceIcon( hDlg, pItem ); UpdateDeviceVersion( hDlg, pItem ); UpdatePowerSource( hDlg, pItem ); UpdateStatus( hDlg, pItem ); UpdateCaption( hDlg, pItem ); CenterWindow(hDlg, g_hwndMain ); return TRUE; } case WM_COMMAND: if( GET_WM_COMMAND_ID(wParam, lParam) == IDOK || GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL) { EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam)); return TRUE; } break; default: return FALSE; } return FALSE; } // Storage properties // // Update storage attributes values in storage properties dialog void UpdateAttributes( HWND hDlg, CItemData* pDevice ) { char pszAttr[MAX_PATH]; static SType_String sTypeStringArray[] = { { WMDM_STORAGE_ATTR_FILESYSTEM , "Filesystem" }, { WMDM_STORAGE_ATTR_REMOVABLE , "Removable" }, { WMDM_STORAGE_ATTR_NONREMOVABLE , "Nonremovable" }, { WMDM_STORAGE_ATTR_FOLDERS , "Folders" }, { WMDM_STORAGE_ATTR_HAS_FOLDERS , "Has folders" }, { WMDM_STORAGE_ATTR_HAS_FILES , "Has files" }, { WMDM_FILE_ATTR_FOLDER , "Folder" }, { WMDM_FILE_ATTR_LINK , "Link" }, { WMDM_FILE_ATTR_FILE , "File" }, { WMDM_FILE_ATTR_AUDIO , "Audio" }, { WMDM_FILE_ATTR_DATA , "Data" }, { WMDM_FILE_ATTR_MUSIC , "Music" }, { WMDM_FILE_ATTR_AUDIOBOOK , "Audiobook" }, { WMDM_FILE_ATTR_HIDDEN , "Hidden" }, { WMDM_FILE_ATTR_SYSTEM , "System" }, { WMDM_FILE_ATTR_READONLY , "Readonly" }, { 0, NULL }, }; // Add all the attributes reported by the device as to the string. pszAttr[0] = '\0'; for( int iIndex = 0; sTypeStringArray[iIndex].dwType != 0; iIndex++ ) { // Is this bit set, if it is then add the attribute as a string if( sTypeStringArray[iIndex].dwType & pDevice->m_dwAttributes ) { if( strlen(pszAttr) ) { strcat( pszAttr, ", " ); } strcat( pszAttr, sTypeStringArray[iIndex].pszString ); } } SetDlgItemText( hDlg, IDC_ATTRIBUTES, (strlen(pszAttr) ? pszAttr : "") ); } // Update storage capabilities values in storage properties dialog void UpdateCapabilities( HWND hDlg, CItemData* pDevice ) { char pszCap[MAX_PATH]; static SType_String sTypeStringArray[] = { { WMDM_FILE_ATTR_CANPLAY , "Play" }, { WMDM_FILE_ATTR_CANDELETE , "Delete" }, { WMDM_FILE_ATTR_CANMOVE , "Move" }, { WMDM_FILE_ATTR_CANRENAME , "Rename" }, { WMDM_FILE_ATTR_CANREAD , "Read" }, { 0, NULL }, }; // Add all the attributes reported by the device as to the string. pszCap[0] = '\0'; for( int iIndex = 0; sTypeStringArray[iIndex].dwType != 0; iIndex++ ) { // Is this bit set, if it is then add the capability as a string if( sTypeStringArray[iIndex].dwType & pDevice->m_dwAttributes ) { if( strlen(pszCap) ) { strcat( pszCap, ", " ); } strcat( pszCap, sTypeStringArray[iIndex].pszString ); } } SetDlgItemText( hDlg, IDC_CAPABILITIES, (strlen(pszCap) ? pszCap : "") ); } // Add the storage icon to the storage properties dialog void UpdateStorageIcon( HWND hDlg, CItemData* pDevice ) { HICON hIcon; BOOL bIsDirectory; bIsDirectory = pDevice->m_dwAttributes & WMDM_FILE_ATTR_FOLDER; hIcon = GetShellIcon( pDevice->m_szName, bIsDirectory ); ::SendMessage(hDlg, WM_SETICON, FALSE, (LPARAM)hIcon ); } // Procedure for storage property dialog box INT_PTR CALLBACK StorageProp_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { CItemData* pItem = (CItemData*)lParam; if( pItem == NULL ) return FALSE; UpdateSerialId( hDlg, pItem ); UpdateAttributes( hDlg, (CItemData*)lParam ); UpdateCapabilities( hDlg, (CItemData*)lParam ); UpdateStorageIcon( hDlg, (CItemData*)lParam ); UpdateStatus( hDlg, pItem ); UpdateCaption( hDlg, pItem ); CenterWindow(hDlg, g_hwndMain ); return TRUE; } case WM_COMMAND: if( GET_WM_COMMAND_ID(wParam, lParam) == IDOK || GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL) { EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam)); return TRUE; } break; default: return FALSE; } return FALSE; }