ANSI.CPP

/* 
* ANSI.CPP
*
* Utility functions for dealing with OLE APIs that need
* Unicode strings. These are only defined when UNICODE
* is not defined, otherwise INOLE.H simply redefines them
* as macro pass-throughs to the original OLE functions.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/


#define NOMACROREDIRECT
#include "inoledll.h"


#ifdef WIN32ANSI

/*
* ConvertStringAlloc
*
* Purpose:
* Allocates memory using the task allocator. Used internally
* in this file.
*/

HRESULT ConvertStringAlloc(ULONG ulSize, void **ppv)
{
HRESULT hr;
IMalloc *pIMalloc;

if (NULL==ppv)
return ResultFromScode(E_INVALIDARG);

hr=CoGetMalloc(MEMCTX_TASK, &pIMalloc);

if (FAILED(hr))
return hr;

*ppv=pIMalloc->Alloc(ulSize);
pIMalloc->Release();

return (NULL==*ppv) ? ResultFromScode(E_OUTOFMEMORY) : NOERROR;
}



/*
* INOLE_ConvertStringToANSI
*
* Purpose:
* Converts the string in pszW to ANSI, allocating the
* output buffer pointed to by *ppszA on output. The
* string is allocated with COM's task allocator.
*
*/

STDAPI INOLE_ConvertStringToANSI(LPCWSTR pszW, LPSTR *ppszA)
{
ULONG cch;
HRESULT hr;

//If input is NULL then just return the same
if (NULL==pszW)
{
*ppszA=NULL;
return NOERROR;
}

//This calculates the number of MBCS characters we'll need
cch=1+WideCharToMultiByte(CP_ACP, 0, pszW, -1, NULL, 0, NULL, NULL);

hr=ConvertStringAlloc(cch, (void **)ppszA);

if (FAILED(hr))
return hr;

WideCharToMultiByte(CP_ACP, 0, pszW, -1, *ppszA, cch, NULL, NULL);
return NOERROR;
}




/*
* INOLE_StringFromCLSID
*/

STDAPI INOLE_StringFromCLSID(REFCLSID clsID, LPSTR *ppszCLSID)
{
LPWSTR psz;
HRESULT hr;

if (NULL==ppszCLSID)
return ResultFromScode(E_INVALIDARG);

hr=StringFromCLSID(clsID, &psz);

if (FAILED(hr))
return hr;

hr=INOLE_ConvertStringToANSI(psz, ppszCLSID);
CoTaskMemFree((void *)psz);
return hr;
}



/*
* INOLE_StringFromGUID2
*/

STDAPI INOLE_StringFromGUID2(REFGUID guid, LPSTR pszGUID, int cch)
{
LPSTR psz;
HRESULT hr;

if (NULL==pszGUID)
return ResultFromScode(E_INVALIDARG);

hr=INOLE_StringFromCLSID(guid, &psz);

if (FAILED(hr))
return hr;

lstrcpyn(pszGUID, psz, cch);
CoTaskMemFree((void *)psz);
return hr;
}





/*
* INOLE_ProgIDFromCLSID
*/

STDAPI INOLE_ProgIDFromCLSID(REFCLSID clsID, LPSTR *ppszProgID)
{
LPWSTR psz;
HRESULT hr;

if (NULL==ppszProgID)
return ResultFromScode(E_INVALIDARG);

hr=ProgIDFromCLSID(clsID, &psz);

if (FAILED(hr))
return hr;

hr=INOLE_ConvertStringToANSI(psz, ppszProgID);
CoTaskMemFree(psz);
return hr;
}




/*
* INOLE_ReadFmtUserTypeStg
* INOLE_WriteFmtUserTypeStg
*/

STDAPI INOLE_ReadFmtUserTypeStg(IStorage *pIStorage
, CLIPFORMAT *pcf, LPSTR *ppszUserType)
{
HRESULT hr;
LPOLESTR pszUserType;

if (NULL==ppszUserType)
return ResultFromScode(E_INVALIDARG);

hr=ReadFmtUserTypeStg(pIStorage, pcf, &pszUserType);

if (FAILED(hr))
return hr;

if (ppszUserType)
{
hr=INOLE_ConvertStringToANSI(pszUserType, ppszUserType);
CoTaskMemFree(pszUserType);
}

return hr;
}


STDAPI INOLE_WriteFmtUserTypeStg(IStorage *pIStorage, CLIPFORMAT cf
, LPSTR pszUserType)
{
OLECHAR szType[512];
HRESULT hr;

if (NULL==pszUserType)
return ResultFromScode(E_INVALIDARG);

MultiByteToWideChar(CP_ACP, 0, pszUserType, -1, szType, 512);
hr=WriteFmtUserTypeStg(pIStorage, cf, szType);

return hr;
}



/*
* INOLE_StgIsStorageFile
* INOLE_StgCreateDocfile
* INOLE_StgOpenStorage
*/

STDAPI INOLE_StgIsStorageFile(LPCSTR pszName)
{
OLECHAR szTemp[MAX_PATH];

MultiByteToWideChar(CP_ACP, 0, pszName, -1
, szTemp, MAX_PATH);
return StgIsStorageFile(szTemp);
}



STDAPI INOLE_StgCreateDocfile(LPCSTR pszNameA, DWORD grfMode
, DWORD reserved, IStorage **ppIStorage)
{
OLECHAR szTemp[MAX_PATH];
LPOLESTR pszName;

*ppIStorage=NULL;

if (NULL!=pszNameA)
{
MultiByteToWideChar(CP_ACP, 0, pszNameA, -1
, szTemp, MAX_PATH);
pszName=szTemp;
}
else
pszName=NULL;

return StgCreateDocfile(pszName, grfMode, reserved
, ppIStorage);
}



STDAPI INOLE_StgOpenStorage(LPCSTR pszNameA, IStorage *pStgPri
, DWORD grfMode, SNB snbEx, DWORD reserved
, IStorage * *ppIStorage)
{
OLECHAR szTemp[MAX_PATH];
LPOLESTR pszName;

*ppIStorage=NULL;

if (NULL!=pszNameA)
{
MultiByteToWideChar(CP_ACP, 0, pszNameA, -1
, szTemp, MAX_PATH);
pszName= szTemp;
}
else
pszName=NULL;

return StgOpenStorage(pszName, pStgPri, grfMode, snbEx
, reserved, ppIStorage);
}




/*
* INOLE_CreateFileMoniker
* INOLE_CreateItemMoniker
* INOLE_MkParseDisplayName
*/

STDAPI INOLE_CreateFileMoniker(LPCSTR pszPathNameA, LPMONIKER *ppmk)
{
OLECHAR szTemp[MAX_PATH];

if (NULL==ppmk)
return ResultFromScode(E_INVALIDARG);

*ppmk=NULL;

MultiByteToWideChar(CP_ACP, 0, pszPathNameA, -1
, szTemp, MAX_PATH);

return CreateFileMoniker(szTemp, ppmk);
}


STDAPI INOLE_CreateItemMoniker(LPCSTR pszDelimA, LPCSTR pszItemA
, LPMONIKER *ppmk)
{
OLECHAR szItem[MAX_PATH]; //Some assumptions about string length
OLECHAR szDelim[20];

if (NULL==ppmk)
return ResultFromScode(E_INVALIDARG);

*ppmk=NULL;

MultiByteToWideChar(CP_ACP, 0, pszItemA, -1
, szItem, MAX_PATH);
MultiByteToWideChar(CP_ACP, 0, pszDelimA, -1
, szDelim, 20);

return CreateItemMoniker(szDelim, szItem, ppmk);
}


STDAPI INOLE_MkParseDisplayName(LPBC pbc, LPCSTR pszUserNameA
, ULONG *pchEaten, LPMONIKER *ppmk)
{
OLECHAR szTemp[512]; //Assumption on string length

if (NULL==ppmk)
return ResultFromScode(E_INVALIDARG);

*ppmk=NULL;

MultiByteToWideChar(CP_ACP, 0, pszUserNameA, -1
, szTemp, 512);

return MkParseDisplayName(pbc, szTemp, pchEaten, ppmk);
}



/*
* INOLE_OleCreateLinkToFile
* INOLE_OleCreateFromFile
*/

STDAPI INOLE_OleCreateLinkToFile(LPCSTR lpszFileName, REFIID riid
, DWORD renderopt, LPFORMATETC lpFormatEtc
, LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID *ppvObj)
{
OLECHAR szFile[512]; //Assumption on string length

MultiByteToWideChar(CP_ACP, 0, lpszFileName, -1, szFile, 512);
return OleCreateLinkToFile(szFile, riid, renderopt, lpFormatEtc
, pClientSite, pStg, ppvObj);
}



STDAPI INOLE_OleCreateFromFile(REFCLSID rclsid, LPCSTR lpszFileName
, REFIID riid, DWORD renderopt, LPFORMATETC lpFormatEtc
, LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID *ppvObj)
{
OLECHAR szFile[512]; //Assumption on string length

MultiByteToWideChar(CP_ACP, 0, lpszFileName, -1, szFile, 512);
return OleCreateFromFile(rclsid, szFile, riid, renderopt, lpFormatEtc
, pClientSite, pStg, ppvObj);
}

#else

//Do-nothing functions so we can at least export them.

#ifndef WIN32
STDAPI INOLE_ConvertStringToANSI(LPCSTR a, LPSTR *b) {return NOERROR;}
#else
STDAPI INOLE_ConvertStringToANSI(LPCWSTR a, LPSTR *b) {return NOERROR;}
#endif
STDAPI INOLE_StringFromCLSID(REFCLSID a, LPSTR *b) {return NOERROR;}
STDAPI INOLE_StringFromGUID2(REFGUID a, LPSTR b, int c) {return NOERROR;}
STDAPI INOLE_ProgIDFromCLSID(REFCLSID a, LPSTR *b) {return NOERROR;}

STDAPI INOLE_ReadFmtUserTypeStg(IStorage *a, CLIPFORMAT *b, LPSTR *c) {return NOERROR;}
STDAPI INOLE_WriteFmtUserTypeStg(IStorage *a, CLIPFORMAT b, LPSTR c) {return NOERROR;}

STDAPI INOLE_StgIsStorageFile(LPCSTR a) {return NOERROR;}
STDAPI INOLE_StgCreateDocfile(LPCSTR a, DWORD b, DWORD c, IStorage ** d) {return NOERROR;}
STDAPI INOLE_StgOpenStorage(LPCSTR a, IStorage *b, DWORD c, SNB d
, DWORD e, IStorage **f) {return NOERROR;}

STDAPI INOLE_CreateFileMoniker(LPCSTR, LPMONIKER *) {return NOERROR;}
STDAPI INOLE_CreateItemMoniker(LPCSTR, LPCSTR, LPMONIKER *) {return NOERROR;}
STDAPI INOLE_MkParseDisplayName(LPBC, LPCSTR, ULONG *, LPMONIKER *) {return NOERROR;}

STDAPI INOLE_OleCreateLinkToFile(LPCOLESTR, REFIID, DWORD, LPFORMATETC
, LPOLECLIENTSITE, LPSTORAGE, LPVOID *) {return NOERROR;}

STDAPI INOLE_OleCreateFromFile(REFCLSID, LPCOLESTR, REFIID
, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, LPVOID *) {return NOERROR;}


#endif