#include "stdinc.h"

//============================================================================
// This file contains a bunch of Unicode/Ansi thunks to handle calling
// some internal functions that on Windows 95 the strings are Ansi,
// whereas the string on NT are unicode
//============================================================================

// First undefine everything that we are intercepting as to not forward back to us...
#undef PathCleanupSpec

#define THUNKMSG(psz)   TraceMsg(TF_THUNK, "shdv THUNK::%s", psz)


//
//  Now the thunks that allow us to run on Windows 95.
//
//
//
//  This thunks a unicode string to ANSI, but if it's an ordinal, then
//  we just leave it alone.
//

int _AorW_PathCleanupSpec(/*IN OPTIONAL*/ LPCTSTR pszDir, /*IN OUT*/ LPTSTR pszSpec)
{
    THUNKMSG(TEXT("PathCleanupSpec"));

    if (g_bRunningOnNT)
    {
        WCHAR wzDir[MAX_PATH];
        WCHAR wzSpec[MAX_PATH];
        LPWSTR pwszDir = wzDir;
        int iRet;

        if (pszDir)
            SHTCharToUnicode(pszDir, wzDir, ARRAYSIZE(wzDir));
        else
            pwszDir = NULL;

        SHTCharToUnicode(pszSpec, wzSpec, ARRAYSIZE(wzSpec));
        iRet = PathCleanupSpec((LPTSTR)pwszDir, (LPTSTR)wzSpec);

        SHUnicodeToTChar(wzSpec, pszSpec, MAX_PATH);
        return iRet;
    }
    else
    {
        CHAR szDir[MAX_PATH];
        CHAR szSpec[MAX_PATH];
        LPSTR pszDir2 = szDir;
        int iRet;

        if (pszDir)
            SHTCharToAnsi(pszDir, szDir, ARRAYSIZE(szDir));
        else
            pszDir2 = NULL;

        SHTCharToAnsi(pszSpec, szSpec, ARRAYSIZE(szSpec));
        iRet = PathCleanupSpec((LPTSTR)pszDir2, (LPTSTR)szSpec);

        SHAnsiToTChar(szSpec, pszSpec, MAX_PATH);
        return iRet;
    }
}

STDAPI Priv_SHDefExtractIcon(LPCTSTR pszIconFile, int iIndex, UINT uFlags,
                          HICON *phiconLarge, HICON *phiconSmall,
                          UINT nIconSize)
{
    HRESULT hr;
    ASSERT(uFlags == 0);

    //
    // W95 integrated mode supports SHDefExtractIcon.  This supports
    // matching the icon ectracted to the icon color depth.  ExtractIcon
    // doesn't.
    //
#ifndef UNIX
    if ((WhichPlatform() == PLATFORM_INTEGRATED))
    {
#ifdef UNICODE
        if (g_bRunningOnNT) 
        {
            return SHDefExtractIconW(pszIconFile, iIndex, uFlags,
                          phiconLarge, phiconSmall, nIconSize);
        } 
        else 
#endif
        {
            char szIconFile[MAX_PATH];
            SHUnicodeToAnsi(pszIconFile, szIconFile, ARRAYSIZE(szIconFile));
            hr = SHDefExtractIconA(szIconFile, iIndex, uFlags,
                          phiconLarge, phiconSmall, nIconSize);
        }
    }
    else
#endif /* !UNIX */
    {
        char szIconFile[MAX_PATH];
        SHUnicodeToAnsi(pszIconFile, szIconFile, ARRAYSIZE(szIconFile));
        hr = ExtractIconExA(szIconFile, iIndex, phiconLarge,
                           phiconSmall, 1) ? S_OK : E_FAIL;
    }

    return hr;
}