diff options
Diffstat (limited to 'Src/Plugins/Library/ml_pmp/DeviceCommands.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_pmp/DeviceCommands.cpp | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_pmp/DeviceCommands.cpp b/Src/Plugins/Library/ml_pmp/DeviceCommands.cpp new file mode 100644 index 00000000..5c34a84a --- /dev/null +++ b/Src/Plugins/Library/ml_pmp/DeviceCommands.cpp @@ -0,0 +1,192 @@ +#include "main.h" +#include "DeviceCommands.h" + +#include <strsafe.h> +PortableCommand::PortableCommand(const char *name, int title, int description) + : name(name), title(title), description(description) +{ +} + +const char *PortableCommand::GetName() +{ + return name; +} + +HRESULT PortableCommand::GetIcon(wchar_t *buffer, size_t bufferSize, int width, int height) +{ + return E_NOTIMPL; +} + +HRESULT PortableCommand::GetDisplayName(wchar_t *buffer, size_t bufferSize) +{ + if (NULL == buffer) + return E_POINTER; + + WASABI_API_LNGSTRINGW_BUF(title, buffer, bufferSize); + return S_OK; +} + +HRESULT PortableCommand::GetDescription(wchar_t *buffer, size_t bufferSize) +{ + if (NULL == buffer) + return E_POINTER; + + WASABI_API_LNGSTRINGW_BUF(description, buffer, bufferSize); + return S_OK; +} + +#define CBCLASS PortableCommand +START_DISPATCH; +CB(API_GETNAME, GetName); +CB(API_GETICON, GetIcon); +CB(API_GETDISPLAYNAME, GetDisplayName); +CB(API_GETDESCRIPTION, GetDescription); +END_DISPATCH; +#undef CBCLASS + + +BOOL SetDeviceCommandInfo(DeviceCommandInfo *info, const char *name, DeviceCommandFlags flags) +{ + if (NULL == info) + return FALSE; + + info->name = name; + info->flags = flags; + return TRUE; +} + +/* -------------- */ +DeviceCommand::DeviceCommand(const char *name, DeviceCommandFlags flags) +: name(name), flags(flags) +{ +} + +DeviceCommand::DeviceCommand(const DeviceCommandInfo *commandInfo) +: name(commandInfo->name), flags(commandInfo->flags) +{ +} + +const char *DeviceCommand::GetName() +{ + return name; +} + +HRESULT DeviceCommand::GetFlags(DeviceCommandFlags *flags) +{ + *flags = this->flags; + return 0; +} + + +#define CBCLASS DeviceCommand +START_DISPATCH; +REFERENCE_COUNTED; +CB(API_GETNAME, GetName); +CB(API_GETFLAGS, GetFlags); +END_DISPATCH; +#undef CBCLASS + + + +DeviceCommandEnumerator::DeviceCommandEnumerator(const DeviceCommandInfo *commandInfoList, size_t listSize) + : position(0), commands(NULL), count(0) +{ + if (NULL != commandInfoList && + 0 != listSize) + { + commands = (DeviceCommand**)calloc(listSize, sizeof(DeviceCommand*)); + if (NULL != commands) + { + for(count = 0; count < listSize; count++) + { + commands[count] = new DeviceCommand(&commandInfoList[count]); + } + } + } +} + +DeviceCommandEnumerator::~DeviceCommandEnumerator() +{ + if (NULL != commands) + { + while(count--) + commands[count]->Release(); + + free(commands); + } + +} + +HRESULT DeviceCommandEnumerator::Next(ifc_devicesupportedcommand **buffer, size_t bufferMax, size_t *fetched) +{ + size_t available, copied, index; + DeviceCommand **source; + + if (NULL == buffer) + return E_POINTER; + + if (0 == bufferMax) + return E_INVALIDARG; + + if (position >= count) + { + if (NULL != fetched) + *fetched = 0; + + return S_FALSE; + } + + available = count - position; + copied = ((available > bufferMax) ? bufferMax : available); + + source = commands + position; + CopyMemory(buffer, source, copied * sizeof(ifc_devicesupportedcommand*)); + + for(index = 0; index < copied; index++) + buffer[index]->AddRef(); + + position += copied; + + if (NULL != fetched) + *fetched = copied; + + return (bufferMax == copied) ? S_OK : S_FALSE; +} + +HRESULT DeviceCommandEnumerator::Reset(void) +{ + position=0; + return S_OK; +} + +HRESULT DeviceCommandEnumerator::Skip(size_t count) +{ + position += count; + if (position > this->count) + position = this->count; + return (position < this->count) ? S_OK : S_FALSE; +} + +HRESULT DeviceCommandEnumerator::GetCount(size_t *count) +{ + if (NULL == count) + return E_POINTER; + + *count = this->count; + + return S_OK; +} + + +#define CBCLASS DeviceCommandEnumerator +START_DISPATCH; +CB(API_NEXT, Next); +CB(API_RESET, Reset); +CB(API_SKIP, Skip); +CB(API_GETCOUNT, GetCount); +REFERENCE_COUNTED; +END_DISPATCH; +#undef CBCLASS + + + |