#include "stock.h"
#pragma hdrstop



void SHPropertyBag_ReadStrDef(IPropertyBag* ppb, LPCWSTR pszPropName, LPWSTR psz, int cch, LPCWSTR pszDef)
{
    if (FAILED(SHPropertyBag_ReadStr(ppb, pszPropName, psz, cch)))
    {
        if (pszDef)
        {
            StrCpyNW(psz, pszDef, cch);
        }
        else
        {
            StrCpyNW(psz, L"", cch);
        }
    }
}

void SHPropertyBag_ReadIntDef(IPropertyBag* ppb, LPCWSTR pszPropName, int* piResult, int iDef)
{
    if (FAILED(SHPropertyBag_ReadInt(ppb, pszPropName, piResult)))
    {
        *piResult = iDef;
    }
}

void SHPropertyBag_ReadSHORTDef(IPropertyBag* ppb, LPCWSTR pszPropName, SHORT* psh, SHORT shDef)
{
    if (FAILED(SHPropertyBag_ReadSHORT(ppb, pszPropName, psh)))
    {
        *psh = shDef;
    }
}

void SHPropertyBag_ReadLONGDef(IPropertyBag* ppb, LPCWSTR pszPropName, LONG* pl, LONG lDef)
{
    if (FAILED(SHPropertyBag_ReadLONG(ppb, pszPropName, pl)))
    {
        *pl = lDef;
    }
}

void SHPropertyBag_ReadDWORDDef(IPropertyBag* ppb, LPCWSTR pszPropName, DWORD* pdw, DWORD dwDef)
{
    if (FAILED(SHPropertyBag_ReadDWORD(ppb, pszPropName, pdw)))
    {
        *pdw = dwDef;
    }
}

void SHPropertyBag_ReadBOOLDef(IPropertyBag* ppb, LPCWSTR pszPropName, BOOL* pf, BOOL fDef)
{
    if (FAILED(SHPropertyBag_ReadBOOL(ppb, pszPropName, pf)))
    {
        *pf = fDef;
    }
}

BOOL SHPropertyBag_ReadBOOLDefRet(IPropertyBag* ppb, LPCWSTR pszPropName, BOOL fDef)
{
    BOOL fRet;

    SHPropertyBag_ReadBOOLDef(ppb, pszPropName, &fRet, fDef);

    return fRet;
}

void SHPropertyBag_ReadGUIDDef(IPropertyBag* ppb, LPCWSTR pszPropName, GUID* pguid, const GUID* pguidDef)
{
    if (FAILED(SHPropertyBag_ReadGUID(ppb, pszPropName, pguid)))
    {
        *pguid = *pguidDef;
    }
}

void SHPropertyBag_ReadPOINTLDef(IPropertyBag* ppb, LPCWSTR pszPropName, POINTL* ppt, const POINTL* pptDef)
{
    if (FAILED(SHPropertyBag_ReadPOINTL(ppb, pszPropName, ppt)))
    {
        *ppt = *pptDef;
    }
}

void SHPropertyBag_ReadPOINTSDef(IPropertyBag* ppb, LPCWSTR pszPropName, POINTS* ppt, const POINTS* pptDef)
{
    if (FAILED(SHPropertyBag_ReadPOINTS(ppb, pszPropName, ppt)))
    {
        *ppt = *pptDef;
    }
}

void SHPropertyBag_ReadRECTLDef(IPropertyBag* ppb, LPCWSTR pszPropName, RECTL* prc, const RECTL* prcDef)
{
    if (FAILED(SHPropertyBag_ReadRECTL(ppb, pszPropName, prc)))
    {
        *prc = *prcDef;
    }
}

void AppendScreenResString(const WCHAR* psz, WCHAR* pszBuff, ULONG cchBuff)
{
    StrCpyNW(pszBuff, psz, cchBuff);
    ULONG cch = lstrlenW(pszBuff);
    SHGetPerScreenResName(pszBuff + cch, cchBuff- cch, 0);
}

HRESULT SHPropertyBag_ReadStreamScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, IStream** ppstm)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_ReadStream(ppb, szScreenResProp, ppstm);
}

HRESULT SHPropertyBag_WriteStreamScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, IStream* pstm)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_WriteStream(ppb, szScreenResProp, pstm);
}

HRESULT SHPropertyBag_ReadPOINTSScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, POINTS* ppt)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_ReadPOINTS(ppb, szScreenResProp, ppt);
}

HRESULT SHPropertyBag_WritePOINTSScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, const POINTS* ppt)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_WritePOINTS(ppb, szScreenResProp, ppt);
}

void SHPropertyBag_ReadDWORDScreenResDef(IPropertyBag* ppb, LPCWSTR pszPropName, DWORD* pdw, DWORD dw)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    SHPropertyBag_ReadDWORDDef(ppb, szScreenResProp, pdw, dw);
}

HRESULT SHPropertyBag_WriteDWORDScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, const DWORD dw)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_WriteDWORD(ppb, szScreenResProp, dw);
}

HRESULT SHPropertyBag_ReadPOINTLScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, POINTL* ppt)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_ReadPOINTL(ppb, szScreenResProp, ppt);
}

HRESULT SHPropertyBag_WritePOINTLScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, const POINTL* ppt)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_WritePOINTL(ppb, szScreenResProp, ppt);
}

HRESULT SHPropertyBag_ReadRECTLScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, RECTL* prc)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_ReadRECTL(ppb, szScreenResProp, prc);
}

HRESULT SHPropertyBag_WriteRECTLScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName, const RECTL* prc)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_WriteRECTL(ppb, szScreenResProp, prc);
}

HRESULT SHPropertyBag_DeleteScreenRes(IPropertyBag* ppb, LPCWSTR pszPropName)
{
    WCHAR szScreenResProp[128];
    AppendScreenResString(pszPropName, szScreenResProp, ARRAYSIZE(szScreenResProp));

    return SHPropertyBag_Delete(ppb, szScreenResProp);
}