diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_devices/deviceCommands.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_devices/deviceCommands.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_devices/deviceCommands.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_devices/deviceCommands.cpp b/Src/Plugins/Library/ml_devices/deviceCommands.cpp new file mode 100644 index 00000000..2f3ba8e4 --- /dev/null +++ b/Src/Plugins/Library/ml_devices/deviceCommands.cpp @@ -0,0 +1,207 @@ +#include "main.h" +#include "deviceCommands.h" + + +typedef struct DeviceCommandInfo +{ + const char *name; + unsigned int title; + unsigned int description; + unsigned int smallIcon; + unsigned int largeIcon; +} DeviceCommandInfo; + + +static DeviceCommandInfo registeredCommands[] = +{ + { "sync", + IDS_SYNC_COMMAND_TITLE, + IDS_SYNC_COMMAND_DESC, + IDR_SYNC_COMMAND_SMALL_IMAGE, + IDR_SYNC_COMMAND_LARGE_IMAGE }, + { "cancel_sync", + IDS_CANCEL_SYNC_COMMAND_TITLE, + IDS_CANCEL_SYNC_COMMAND_DESC, + IDR_CANCEL_SYNC_COMMAND_SMALL_IMAGE, + IDR_CANCEL_SYNC_COMMAND_LARGE_IMAGE }, + { "attach", + IDS_ATTACH_COMMAND_TITLE, + IDS_ATTACH_COMMAND_DESC, + IDR_ATTACH_COMMAND_SMALL_IMAGE, + IDR_ATTACH_COMMAND_LARGE_IMAGE }, + { "detach", + IDS_DETACH_COMMAND_TITLE, + IDS_DETACH_COMMAND_DESC, + IDR_DETACH_COMMAND_SMALL_IMAGE, + IDR_DETACH_COMMAND_LARGE_IMAGE }, + { "eject", + IDS_EJECT_COMMAND_TITLE, + IDS_EJECT_COMMAND_DESC, + IDR_EJECT_COMMAND_SMALL_IMAGE, + IDR_EJECT_COMMAND_LARGE_IMAGE }, + { "rename", + IDS_RENAME_COMMAND_TITLE, + IDS_RENAME_COMMAND_DESC, + IDR_RENAME_COMMAND_SMALL_IMAGE, + IDR_RENAME_COMMAND_LARGE_IMAGE }, + { "view_open", + IDS_VIEW_OPEN_COMMAND_TITLE, + IDS_VIEW_OPEN_COMMAND_DESC, + IDR_VIEW_OPEN_COMMAND_SMALL_IMAGE, + IDR_VIEW_OPEN_COMMAND_LARGE_IMAGE }, + { "preferences", + IDS_PREFERENCES_COMMAND_TITLE, + IDS_PREFERENCES_COMMAND_DESC, + IDR_PREFERENCES_COMMAND_SMALL_IMAGE, + IDR_PREFERENCES_COMMAND_LARGE_IMAGE }, + { "playlist_create", + IDS_PLAYLIST_CREATE_COMMAND_TITLE, + IDS_PLAYLIST_CREATE_COMMAND_DESC, + IDR_PLAYLIST_CREATE_COMMAND_SMALL_IMAGE, + IDR_PLAYLIST_CREATE_COMMAND_LARGE_IMAGE }, +}; + +static ifc_devicecommand * _cdecl +DeviceCommands_RegisterCommandCb(const char *name, void *user) +{ + size_t index; + wchar_t buffer[2048] = {0}; + DeviceCommandInfo *commandInfo; + ifc_devicecommand *command; + ifc_devicecommandeditor *editor; + + commandInfo = NULL; + for(index = 0; index < ARRAYSIZE(registeredCommands); index++) + { + if (name == registeredCommands[index].name) + { + commandInfo = ®isteredCommands[index]; + break; + } + } + + if (NULL == commandInfo) + return NULL; + + if (NULL == WASABI_API_DEVICES) + return NULL; + + if (FAILED(WASABI_API_DEVICES->CreateCommand(commandInfo->name, &command))) + return NULL; + + if (FAILED(command->QueryInterface(IFC_DeviceCommandEditor, (void**)&editor))) + { + command->Release(); + return NULL; + } + + if (0 != commandInfo->title) + { + WASABI_API_LNGSTRINGW_BUF(commandInfo->title, buffer, ARRAYSIZE(buffer)); + editor->SetDisplayName(buffer); + } + + if (0 != commandInfo->description) + { + WASABI_API_LNGSTRINGW_BUF(commandInfo->description, buffer, ARRAYSIZE(buffer)); + editor->SetDescription(buffer); + } + + if (0 != commandInfo->smallIcon || 0 != commandInfo->largeIcon) + { + ifc_deviceiconstore *iconStore; + if (SUCCEEDED(editor->GetIconStore(&iconStore))) + { + if (0 != commandInfo->smallIcon) + { + if (FALSE != Plugin_GetResourceString(MAKEINTRESOURCE(commandInfo->smallIcon), RT_RCDATA, buffer, ARRAYSIZE(buffer))) + iconStore->Add(buffer, 16, 16, TRUE); + } + + if (0 != commandInfo->largeIcon) + { + if (FALSE != Plugin_GetResourceString(MAKEINTRESOURCE(commandInfo->largeIcon), RT_RCDATA, buffer, ARRAYSIZE(buffer))) + iconStore->Add(buffer, 43, 24, TRUE); + } + + iconStore->Release(); + } + } + + editor->Release(); + return command; +} + +BOOL +DeviceCommands_Register() +{ + const char *commands[ARRAYSIZE(registeredCommands)]; + size_t index; + + if (NULL == WASABI_API_DEVICES) + return FALSE; + + for(index = 0; index < ARRAYSIZE(commands); index++) + { + commands[index] = registeredCommands[index].name; + } + + WASABI_API_DEVICES->CommandRegisterIndirect(commands, ARRAYSIZE(commands), DeviceCommands_RegisterCommandCb, NULL); + + return TRUE; +} + + +BOOL +DeviceCommand_GetSupported(ifc_device *device, const char *name, DeviceCommandContext context, + ifc_devicesupportedcommand **commandOut) +{ + ifc_devicesupportedcommandenum *enumerator; + ifc_devicesupportedcommand *command; + BOOL foundCommand; + + if (NULL == device || + NULL == name || + FAILED(device->EnumerateCommands(&enumerator, context))) + { + return FALSE; + } + + foundCommand = FALSE; + + while (S_OK == enumerator->Next(&command, 1, NULL)) + { + if (CSTR_EQUAL == CompareStringA(CSTR_INVARIANT, 0, name, -1, command->GetName(), -1)) + { + foundCommand = TRUE; + + if (NULL != commandOut) + *commandOut = command; + else + command->Release(); + + break; + } + command->Release(); + } + + enumerator->Release(); + return foundCommand; +} + +BOOL +DeviceCommand_GetEnabled(ifc_device *device, const char *name, DeviceCommandContext context) +{ + ifc_devicesupportedcommand *command; + DeviceCommandFlags flags; + + if (FALSE == DeviceCommand_GetSupported(device, name, context, &command)) + return FALSE; + + if (FAILED(command->GetFlags(&flags))) + flags = DeviceCommandFlag_Disabled; + + command->Release(); + + return (0 == (DeviceCommandFlag_Disabled & flags)); +}
\ No newline at end of file |