aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_devices/deviceCommands.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_devices/deviceCommands.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-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.cpp207
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 = &registeredCommands[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