HRESULT CWIACapabilityManager::Initialize(_In_ HINSTANCE hInstance)
{
    HRESULT hr = E_INVALIDARG;
    if(hInstance)
    {
        m_hInstance = hInstance;
        hr = S_OK;
    }
    else
    {
        WIAS_ERROR((g_hInst, "Invalid parameters were passed"));
    }
    return hr;
}
void CWIACapabilityManager::FreeCapability(_In_ WIA_DEV_CAP_DRV *pWIADeviceCapability, 
                                                BOOL            bFreeCapabilityContentOnly)
{
    if(pWIADeviceCapability)
    {
        if(pWIADeviceCapability->guid)
        {
            CoTaskMemFree(pWIADeviceCapability->guid);
            pWIADeviceCapability->guid = NULL;
        }

        if(pWIADeviceCapability->wszName)
        {
            CoTaskMemFree(pWIADeviceCapability->wszName);
            pWIADeviceCapability->wszName = NULL;
        }

        if(pWIADeviceCapability->wszDescription)
        {
            CoTaskMemFree(pWIADeviceCapability->wszDescription);
            pWIADeviceCapability->wszDescription = NULL;
        }

        if(pWIADeviceCapability->wszIcon)
        {
            CoTaskMemFree(pWIADeviceCapability->wszIcon);
            pWIADeviceCapability->wszIcon = NULL;
        }

        if(bFreeCapabilityContentOnly == FALSE)
        {
            CoTaskMemFree(pWIADeviceCapability);
            pWIADeviceCapability = NULL;
        }
    }
    else
    {
        WIAS_ERROR((g_hInst, "Invalid parameters were passed, caller attempted to free a NULL WIA_DEV_CAP_DRV structure"));
    }
}
Example #3
0
HRESULT CWIAPropertyManager::SetItemProperties(__inout BYTE *pWiasContext)
{

    HRESULT hr = E_INVALIDARG;
    if(pWiasContext)
    {
        hr = S_OK;

        //
        // get current number of properties in the list
        //

        LONG lNumProps = m_List.Size();
        if(lNumProps)
        {
            LONG lIndex = 0;

            LPOLESTR *pszName = (LPOLESTR*) LocalAlloc(LPTR,sizeof(LPOLESTR)*lNumProps);
            PROPID *ppid = (PROPID*) LocalAlloc(LPTR,sizeof(PROPID)*lNumProps);
            PROPVARIANT *ppv = (PROPVARIANT*) LocalAlloc(LPTR,sizeof(PROPVARIANT)*lNumProps);
            PROPSPEC *pps = (PROPSPEC*) LocalAlloc(LPTR,sizeof(PROPSPEC)*lNumProps);
            WIA_PROPERTY_INFO *pwpi = (WIA_PROPERTY_INFO*) LocalAlloc(LPTR,sizeof(WIA_PROPERTY_INFO)*lNumProps);

            if((pszName)&&(ppid)&&(ppv)&&(pps)&&(pwpi))
            {

                //
                // copy the property data into the proper structures
                //

                for(INT i = 0; i < m_List.Size(); i++)
                {
                    PWIA_PROPERTY_INFO_DATA pPropertyData = m_List[i];
                    if(pPropertyData)
                    {
                        pszName[lIndex] = pPropertyData->szName;
                        ppid[lIndex] = pPropertyData->pid;
                        memcpy(&ppv[lIndex],&pPropertyData->pv,sizeof(PROPVARIANT));
                        memcpy(&pps[lIndex],&pPropertyData->ps, sizeof(PROPSPEC));
                        memcpy(&pwpi[lIndex],&pPropertyData->wpi,sizeof(WIA_PROPERTY_INFO));
                        lIndex++;
                    }
                }

                //
                // send the property names to the WIA service
                //

                hr = wiasSetItemPropNames(pWiasContext,lNumProps,ppid,pszName);
                if(SUCCEEDED(hr))
                {

                    //
                    // send the property values to the WIA service
                    //

                    hr = wiasWriteMultiple(pWiasContext,lNumProps,pps,ppv);
                    if(SUCCEEDED(hr))
                    {

                        //
                        // send the property valid values to the WIA service
                        //

                        hr = wiasSetItemPropAttribs(pWiasContext,lNumProps,pps,pwpi);
                        if(FAILED(hr))
                        {
                            WIAS_ERROR((g_hInst, "CWIAPropertyManager_SetItemProperties - wiasSetItemPropAttribs failed"));
                        }
                    }
                    else
                    {
                        WIAS_ERROR((g_hInst, "CWIAPropertyManager_SetItemProperties - wiasWriteMultiple failed"));
                    }
                }
                else
                {
                    WIAS_ERROR((g_hInst, "CWIAPropertyManager_SetItemProperties - wiasSetItemPropNames failed"));
                }
            }
            else
            {
                WIAS_ERROR((g_hInst, "CWIAPropertyManager_SetItemProperties - failed to allocate memory for property arrays"));
                hr = E_OUTOFMEMORY;
            }

            //
            // always delete any temporary memory allocated before exiting the function.  The WIA
            // service makes a copy of the information during the "wias" helper calls.
            //

            if(pszName)
            {
                LocalFree(pszName);
                pszName = NULL;
            }

            if(ppid)
            {
                LocalFree(ppid);
                ppid = NULL;
            }

            if(ppv)
            {
                LocalFree(ppv);
                ppv = NULL;
            }

            if(pps)
            {
                LocalFree(pps);
                pps = NULL;
            }

            if(pwpi)
            {
                LocalFree(pwpi);
                pwpi = NULL;
            }
        }
    }
    return hr;
}
HRESULT CWIACapabilityManager::AddCapability(const GUID    guidCapability,
                                             UINT          uiNameResourceID,
                                             UINT          uiDescriptionResourceID,
                                             ULONG         ulFlags,
                                             _In_ LPWSTR   wszIcon)
{
    HRESULT hr = S_OK;

    WIA_DEV_CAP_DRV *pWIADeviceCapability = NULL;
    hr = AllocateCapability(&pWIADeviceCapability);
    if((SUCCEEDED(hr)&& (pWIADeviceCapability)))
    {
        pWIADeviceCapability->ulFlags = ulFlags;
        *pWIADeviceCapability->guid   = guidCapability;

        CBasicStringWide cswCapabilityString;

        //
        // Load capability name from resource
        //

        if(cswCapabilityString.LoadString(uiNameResourceID,m_hInstance))
        {
            hr = StringCbCopyW(pWIADeviceCapability->wszName,
                               MAX_CAPABILITY_STRING_SIZE_BYTES,
                               cswCapabilityString.String());
            if(FAILED(hr))
            {
                WIAS_ERROR((g_hInst, "Failed to copy source string (%ws) to destination string, hr = 0x%lx",cswCapabilityString.String(),hr));
            }
        }
        else
        {
            hr = E_FAIL;
            WIAS_ERROR((g_hInst, "Failed to load the device capability name string from DLL resource, hr = 0x%lx",hr));
        }

        //
        // Load capability description from resource
        //

        if(cswCapabilityString.LoadString(uiDescriptionResourceID,m_hInstance))
        {
            hr = StringCbCopyW(pWIADeviceCapability->wszDescription,
                               MAX_CAPABILITY_STRING_SIZE_BYTES,
                               cswCapabilityString.String());
            if(FAILED(hr))
            {
                WIAS_ERROR((g_hInst, "Failed to copy source string (%ws) to destination string, hr = 0x%lx",cswCapabilityString.String(),hr));
            }
        }
        else
        {
            hr = E_FAIL;
            WIAS_ERROR((g_hInst, "Failed to load the device capability description string from DLL resource, hr = 0x%lx",hr));
        }

        //
        // Copy icon location string
        //

        cswCapabilityString = wszIcon;

        if(cswCapabilityString.Length())
        {
            hr = StringCbCopyW(pWIADeviceCapability->wszIcon,
                               MAX_CAPABILITY_STRING_SIZE_BYTES,
                               cswCapabilityString.String());
            if(FAILED(hr))
            {
                WIAS_ERROR((g_hInst, "Failed to copy source string (%ws) to destination string, hr = 0x%lx",cswCapabilityString.String(),hr));
            }
        }
        else
        {
            hr = E_FAIL;
            WIAS_ERROR((g_hInst, "Failed to load the device capability icon location string from DLL resource, hr = 0x%lx",hr));
        }

        if(SUCCEEDED(hr))
        {
            if((pWIADeviceCapability->ulFlags == WIA_NOTIFICATION_EVENT) ||
               (pWIADeviceCapability->ulFlags == WIA_ACTION_EVENT))
            {
                //
                // The capability being added is an event, so always add it to the beginning of the array
                //

                m_CapabilityArray.Insert(*pWIADeviceCapability,0);
            }
            else
            {
                //
                // The capability being added is a command, so always add it to the end of the array
                //

                m_CapabilityArray.Append(*pWIADeviceCapability);
            }
        }

        if(pWIADeviceCapability)
        {
            CoTaskMemFree(pWIADeviceCapability);
            pWIADeviceCapability = NULL;
        }
    }
    return hr;
}
HRESULT CWIACapabilityManager::AllocateCapability(_Out_ WIA_DEV_CAP_DRV **ppWIADeviceCapability)
{
    HRESULT hr = E_INVALIDARG;
    if(ppWIADeviceCapability)
    {
        *ppWIADeviceCapability                = NULL;
        WIA_DEV_CAP_DRV *pWIADeviceCapability = NULL;

#pragma prefast(suppress:__WARNING_MEMORY_LEAK, "Freed when calling FreeCapability(*ppWIADeviceCapability).")
        pWIADeviceCapability = (WIA_DEV_CAP_DRV*)CoTaskMemAlloc(sizeof(WIA_DEV_CAP_DRV));
        if(pWIADeviceCapability)
        {
            memset(pWIADeviceCapability,0,sizeof(WIA_DEV_CAP_DRV));
            //
            // attempt to allocate the GUID member of the structure
            //
			
#pragma prefast(suppress:__WARNING_MEMORY_LEAK, "Freed when calling FreeCapability(*ppWIADeviceCapability).")
            pWIADeviceCapability->guid = (GUID*)CoTaskMemAlloc(sizeof(GUID));
            if(pWIADeviceCapability->guid)
            {
                *pWIADeviceCapability->guid = GUID_NULL;
                hr = S_OK;
            }
            else
            {
                hr = E_OUTOFMEMORY;
                WIAS_ERROR((g_hInst, "Failed to allocate memory for GUID member of WIA_DEV_CAP_DRV structure, hr = 0x%lx",hr));
            }

            //
            // attempt to allocate the LPOLESTR name member of the structure
            //

            if(SUCCEEDED(hr))
            {
#pragma prefast(suppress:__WARNING_MEMORY_LEAK, "Freed when calling FreeCapability(*ppWIADeviceCapability).")
                pWIADeviceCapability->wszName = (LPOLESTR)CoTaskMemAlloc(MAX_CAPABILITY_STRING_SIZE_BYTES);
                if(pWIADeviceCapability->wszName)
                {
                    memset(pWIADeviceCapability->wszName,0,MAX_CAPABILITY_STRING_SIZE_BYTES);
                    hr = S_OK;
                }
                else
                {
                    hr = E_OUTOFMEMORY;
                    WIAS_ERROR((g_hInst, "Failed to allocate memory for LPOLESTR (wszName) member of WIA_DEV_CAP_DRV structure, hr = 0x%lx",hr));
                }
            }

            //
            // attempt to allocate the LPOLESTR description member of the structure
            //

            if(SUCCEEDED(hr))
            {
#pragma prefast(suppress:__WARNING_MEMORY_LEAK, "Freed when calling FreeCapability(*ppWIADeviceCapability).")
                pWIADeviceCapability->wszDescription = (LPOLESTR)CoTaskMemAlloc(MAX_CAPABILITY_STRING_SIZE_BYTES);
                if(pWIADeviceCapability->wszDescription)
                {
                    memset(pWIADeviceCapability->wszDescription,0,MAX_CAPABILITY_STRING_SIZE_BYTES);
                    hr = S_OK;
                }
                else
                {
                    hr = E_OUTOFMEMORY;
                    WIAS_ERROR((g_hInst, "Failed to allocate memory for LPOLESTR (wszDescription) member of WIA_DEV_CAP_DRV structure, hr = 0x%lx",hr));
                }
            }

            //
            // attempt to allocate the LPOLESTR icon member of the structure
            //

            if(SUCCEEDED(hr))
            {
#pragma prefast(suppress:__WARNING_MEMORY_LEAK, "Freed when calling FreeCapability(*ppWIADeviceCapability).")
                pWIADeviceCapability->wszIcon = (LPOLESTR)CoTaskMemAlloc(MAX_CAPABILITY_STRING_SIZE_BYTES);
                if(pWIADeviceCapability->wszIcon)
                {
                    memset(pWIADeviceCapability->wszIcon,0,MAX_CAPABILITY_STRING_SIZE_BYTES);
                    hr = S_OK;
                }
                else
                {
                    hr = E_OUTOFMEMORY;
                    WIAS_ERROR((g_hInst, "Failed to allocate memory for LPOLESTR (wszIcon) member of WIA_DEV_CAP_DRV structure, hr = 0x%lx",hr));
                }
            }

            if(SUCCEEDED(hr))
            {
                *ppWIADeviceCapability = pWIADeviceCapability;
            }
            else
            {
                FreeCapability(pWIADeviceCapability);
                pWIADeviceCapability = NULL;
            }
        }
        else
        {
            hr = E_OUTOFMEMORY;
            WIAS_ERROR((g_hInst, "Failed to allocate memory for WIA_DEV_CAP_DRV structure, hr = 0x%lx",hr));
        }
    }
    return hr;
}