diff options
Diffstat (limited to 'audio/sysvad/SwapAPO/PropPageExtensions/Parts.cpp')
| -rw-r--r-- | audio/sysvad/SwapAPO/PropPageExtensions/Parts.cpp | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/audio/sysvad/SwapAPO/PropPageExtensions/Parts.cpp b/audio/sysvad/SwapAPO/PropPageExtensions/Parts.cpp new file mode 100644 index 00000000..41130ead --- /dev/null +++ b/audio/sysvad/SwapAPO/PropPageExtensions/Parts.cpp @@ -0,0 +1,298 @@ +//**@@@*@@@**************************************************** +// +// Microsoft Windows DevTopo.dll +// Copyright (C) Microsoft Corporation. All rights reserved. +// +//**@@@*@@@**************************************************** + +// +// FileName: Parts.cpp +// +// Abstract: Implementation of CPart and derived classes. +// +// -------------------------------------------------------------------------------- + +#include "stdafx.h" +#include <DeviceTopology.h> +#include "Parts.h" + +_Analysis_mode_(_Analysis_code_type_user_driver_) + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::CPartsList +// +// Description: +// CPartsList constructor +// ---------------------------------------------------------------------- +CPartsList::CPartsList() : + m_refCount(1) +{ +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::~CPartsList +// +// Description: +// CPartsList destructor +// ---------------------------------------------------------------------- +CPartsList::~CPartsList() +{ + ATLASSERT(m_refCount == 0); + + IPart* pIPart; + while (m_lstParts.RemoveHead(&pIPart)) + { + SAFE_RELEASE(pIPart); + } +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::QueryInterface +// +// Description: +// Implementation of IUnknown::QueryInterface +// +// Parameters: +// riid - [in] Identifier of the interface being queried +// ppvObj - [in] Pointer to a buffer that receives a pointer to the +// object whose interface is queried +// +// Return: +// S_OK if successful +// ---------------------------------------------------------------------- +STDMETHODIMP CPartsList::QueryInterface +( + const IID& iid, + void** ppUnk +) +{ + if (!ppUnk) + return E_POINTER; + + HRESULT hr = E_NOINTERFACE; + *ppUnk = NULL; + + if (iid == __uuidof(IPartsList)) + { + *ppUnk = (IPartsList*)this; + hr = S_OK; + AddRef(); + } + else + if (iid == __uuidof(IUnknown)) + { + *ppUnk = (IUnknown*)this; + hr = S_OK; + AddRef(); + } + + return hr; +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::AddRef +// +// Description: +// Implementation of IUnknown::AddRef +// +// Return: +// New refcount +// ---------------------------------------------------------------------- +ULONG STDMETHODCALLTYPE CPartsList::AddRef(void) +{ + return InterlockedIncrement(&m_refCount); +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::Release +// +// Description: +// Implementation of IUnknown::Release +// +// Return: +// New refcount +// ---------------------------------------------------------------------- +ULONG STDMETHODCALLTYPE CPartsList::Release(void) +{ + ATLASSERT(m_refCount > 0); + LONG lRef = InterlockedDecrement(&m_refCount); + ATLASSERT(lRef >= 0); + + if (lRef == 0) + { + delete this; + } + return lRef; +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::AddPart +// +// Description: +// Adds an item to the list of IPart interfaces +// +// Parameters: +// pIPart - [in] Part to add to the list +// +// Return: +// S_OK if successful +// ---------------------------------------------------------------------- +STDMETHODIMP CPartsList::AddPart +( + IPart* pIPart +) +{ + if (pIPart == NULL) + return E_POINTER; + + // Protect m_lstParts access + m_CritSection.Enter(); + + pIPart->AddRef(); + m_lstParts.AddTail(pIPart); + + m_CritSection.Leave(); + + return S_OK; +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::AddPart +// +// Description: +// Adds the PartsList Parts to the list of IPart interfaces +// +// Parameters: +// pIParts - [in] List of Parts to be added to the list +// +// Return: +// S_OK if successful +// ---------------------------------------------------------------------- +STDMETHODIMP CPartsList::AddParts +( + IPartsList* pIParts +) +{ + ATLASSERT(pIParts != NULL); + + HRESULT hr = S_OK; + UINT i, cParts = 0; + + // Protect m_lstParts + m_CritSection.Enter(); + + // Loop through specified parts list + hr = pIParts->GetCount(&cParts); + IF_FAILED_JUMP(hr, Exit); + + for (i = 0; (i < cParts) && (hr == S_OK); i++) + { + IPart* pIPart; + + // ... and copy reference to each part + hr = pIParts->GetPart(i, &pIPart); + IF_FAILED_JUMP(hr, Exit); + + // ... to this list + m_lstParts.AddTail(pIPart); + } + +Exit: + m_CritSection.Leave(); + + return hr; +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::GetCount +// +// Description: +// Returns the count of items in the list of IParts +// +// Parameters: +// pCount - [out] the count of parts in this list +// +// Return: +// S_OK if successful +// +// ---------------------------------------------------------------------- +_Use_decl_annotations_ +STDMETHODIMP CPartsList::GetCount +( + UINT* pCount +) +{ + if (pCount == NULL) + return E_POINTER; + + // Protect m_lstParts access + m_CritSection.Enter(); + + *pCount = m_lstParts.GetCount(); + + m_CritSection.Leave(); + + return S_OK; +} + + +// ---------------------------------------------------------------------- +// Function: +// CPartsList::GetPart +// +// Description: +// Returns the nIndex-th item in the list of IParts +// +// Parameters: +// nIndex - [in] index of the part to access +// uMsg - [out] the part at the specified index +// +// Return: +// S_OK if successful +// +// ---------------------------------------------------------------------- +_Use_decl_annotations_ +STDMETHODIMP CPartsList::GetPart +( + UINT nIndex, + IPart** ppPart +) +{ + HRESULT hr; + IPart* pIPart = NULL; + + // Protect m_lstParts access + m_CritSection.Enter(); + + IF_TRUE_ACTION_JUMP((ppPart == NULL), hr = E_POINTER, Exit); + + *ppPart = NULL; + + IF_TRUE_ACTION_JUMP((nIndex >= m_lstParts.GetCount()), hr = E_INVALIDARG, Exit); + + IF_TRUE_ACTION_JUMP((!m_lstParts.GetAt(nIndex, &pIPart)), hr = E_NOTFOUND, Exit); + + // Take care of AddRef and ensure correct interface in one shot + hr = pIPart->QueryInterface(__uuidof(IPart), reinterpret_cast<void**>(ppPart)); + IF_FAILED_JUMP(hr, Exit); + +Exit: + m_CritSection.Leave(); + + return hr; +} |
