123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- #include "main.h"
- #include "./deviceCommand.h"
- #include <strsafe.h>
- DeviceCommand::DeviceCommand()
- : ref(1), name(NULL), displayName(NULL), description(NULL)
- {
- if (FAILED(DeviceIconStore::CreateInstance(&iconStore)))
- iconStore = NULL;
- InitializeCriticalSection(&lock);
- }
- DeviceCommand::~DeviceCommand()
- {
- AnsiString_Free(name);
- String_Free(displayName);
- String_Free(description);
- if (NULL != iconStore)
- iconStore->Release();
- DeleteCriticalSection(&lock);
- }
- HRESULT DeviceCommand::CreateInstance(const char *name, DeviceCommand **instance)
- {
- char *nameCopy;
- if (NULL == instance)
- return E_POINTER;
- if (FALSE != IS_STRING_EMPTY(name))
- return E_INVALIDARG;
- *instance = new DeviceCommand();
- if (NULL == *instance)
- return E_OUTOFMEMORY;
- nameCopy = AnsiString_Duplicate(name);
- if (NULL == nameCopy)
- {
- (*instance)->Release();
- return E_OUTOFMEMORY;
- }
- (*instance)->name = nameCopy;
-
- return S_OK;
- }
- size_t DeviceCommand::AddRef()
- {
- return InterlockedIncrement((LONG*)&ref);
- }
- size_t DeviceCommand::Release()
- {
- if (0 == ref)
- return ref;
-
- LONG r = InterlockedDecrement((LONG*)&ref);
- if (0 == r)
- delete(this);
-
- return r;
- }
- int DeviceCommand::QueryInterface(GUID interface_guid, void **object)
- {
- if (NULL == object) return E_POINTER;
-
- if (IsEqualIID(interface_guid, IFC_DeviceCommand))
- *object = static_cast<ifc_devicecommand*>(this);
- else if (IsEqualIID(interface_guid, IFC_DeviceCommandEditor))
- *object = static_cast<ifc_devicecommandeditor*>(this);
- else if (IsEqualIID(interface_guid, IFC_DeviceObject))
- *object = static_cast<ifc_deviceobject*>(this);
- else
- {
- *object = NULL;
- return E_NOINTERFACE;
- }
- if (NULL == *object)
- return E_UNEXPECTED;
- AddRef();
- return S_OK;
- }
- void DeviceCommand::Lock()
- {
- EnterCriticalSection(&lock);
- }
- void DeviceCommand::Unlock()
- {
- LeaveCriticalSection(&lock);
- }
- const char *DeviceCommand::GetName()
- {
- return name;
- }
- HRESULT DeviceCommand::GetIcon(wchar_t *buffer, size_t bufferSize, int width, int height)
- {
- HRESULT hr;
-
- if (NULL == buffer)
- return E_POINTER;
-
- Lock();
- if (NULL == iconStore)
- hr = E_UNEXPECTED;
- else
- hr = iconStore->Get(buffer, bufferSize, width, height);
- Unlock();
- return hr;
- }
- HRESULT DeviceCommand::GetDisplayName(wchar_t *buffer, size_t bufferSize)
- {
- HRESULT hr;
- if (NULL == buffer)
- return E_POINTER;
-
- Lock();
- hr = StringCchCopyExW(buffer, bufferSize, displayName, NULL, NULL, STRSAFE_IGNORE_NULLS);
- Unlock();
- return hr;
- }
- HRESULT DeviceCommand::GetDescription(wchar_t *buffer, size_t bufferSize)
- {
- HRESULT hr;
- if (NULL == buffer)
- return E_POINTER;
-
- Lock();
- hr = StringCchCopyExW(buffer, bufferSize, description, NULL, NULL, STRSAFE_IGNORE_NULLS);
- Unlock();
- return hr;
- }
- HRESULT DeviceCommand::GetIconStore(ifc_deviceiconstore **store)
- {
- HRESULT hr;
- if (NULL == store)
- return E_POINTER;
- Lock();
- if (NULL == iconStore)
- hr = E_UNEXPECTED;
- else
- {
- iconStore->AddRef();
- *store = iconStore;
- hr = S_OK;
- }
- Unlock();
- return hr;
- }
- HRESULT DeviceCommand::SetDisplayName(const wchar_t *displayName)
- {
- HRESULT hr;
- Lock();
- String_Free(this->displayName);
- this->displayName = String_Duplicate(displayName);
-
- if (NULL == this->displayName && NULL != displayName)
- hr = E_OUTOFMEMORY;
- else
- hr = S_OK;
- Unlock();
- return hr;
- }
- HRESULT DeviceCommand::SetDescription(const wchar_t *description)
- {
- HRESULT hr;
- Lock();
- String_Free(this->description);
- this->description = String_Duplicate(description);
-
- if (NULL == this->description && NULL != description)
- hr = E_OUTOFMEMORY;
- else
- hr = S_OK;
- Unlock();
- return hr;
- }
- #define CBCLASS DeviceCommand
- START_MULTIPATCH;
- START_PATCH(MPIID_DEVICECOMMAND)
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, ADDREF, AddRef);
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, RELEASE, Release);
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, QUERYINTERFACE, QueryInterface);
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, API_GETNAME, GetName);
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, API_GETICON, GetIcon);
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, API_GETDISPLAYNAME, GetDisplayName);
- M_CB(MPIID_DEVICECOMMAND, ifc_devicecommand, API_GETDESCRIPTION, GetDescription);
- NEXT_PATCH(MPIID_DEVICECOMMANDEDITOR)
- M_CB(MPIID_DEVICECOMMANDEDITOR, ifc_devicecommandeditor, ADDREF, AddRef);
- M_CB(MPIID_DEVICECOMMANDEDITOR, ifc_devicecommandeditor, RELEASE, Release);
- M_CB(MPIID_DEVICECOMMANDEDITOR, ifc_devicecommandeditor, QUERYINTERFACE, QueryInterface);
- M_CB(MPIID_DEVICECOMMANDEDITOR, ifc_devicecommandeditor, API_SETDISPLAYNAME, SetDisplayName);
- M_CB(MPIID_DEVICECOMMANDEDITOR, ifc_devicecommandeditor, API_SETDESCRIPTION, SetDescription);
- M_CB(MPIID_DEVICECOMMANDEDITOR, ifc_devicecommandeditor, API_GETICONSTORE, GetIconStore);
- END_PATCH
- END_MULTIPATCH;
|