//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: wrapstub.cpp
//
// Contents: ANSI to Unicode wrappers and Unicode stubs
//
// Classes: WrappedIOleUILinkContainer
// WrappedIOleUIObjInfo
// WrappedIOleUILinkInfo
//
// Functions:
#ifdef UNICODE
// OleUIAddVerbMenuA
// OleUIInsertObjectA
// OleUIPasteSpecialA
// OleUIEditLinksA
// OleUIChangeIconA
// OleUIConvertA
// OleUIBusyA
// OleUIUpdateLinksA
// OleUIObjectPropertiesA
// OleUIChangeSourceA
// OleUIPromptUserA
#else
// OleUIAddVerbMenuW
// OleUIInsertObjectW
// OleUIPasteSpecialW
// OleUIEditLinksW
// OleUIChangeIconW
// OleUIConvertW
// OleUIBusyW
// OleUIUpdateLinksW
// OleUIObjectPropertiesW
// OleUIChangeSourceW
// OleUIPromptUserW
#endif
//
// History: 11-02-94 stevebl Created
//
//----------------------------------------------------------------------------
#include "precomp.h"
#include "common.h"
#ifdef UNICODE
// ANSI to Unicode Wrappers
//+---------------------------------------------------------------------------
//
// Function: OleUIAddVerbMenuA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [lpOleObj] -
// [lpszShortType] - [in] on heap
// [hMenu] -
// [uPos] -
// [uIDVerbMin] -
// [uIDVerbMax] -
// [bAddConvert] -
// [idConvert] -
// [lphMenu] -
//
// History: 11-04-94 stevebl Created
//
//----------------------------------------------------------------------------
STDAPI_(BOOL) OleUIAddVerbMenuA(LPOLEOBJECT lpOleObj, LPCSTR lpszShortType,
HMENU hMenu, UINT uPos, UINT uIDVerbMin, UINT uIDVerbMax,
BOOL bAddConvert, UINT idConvert, HMENU FAR *lphMenu)
{
LPWSTR lpwszShortType = NULL;
if (lpszShortType && !IsBadReadPtr(lpszShortType, 1))
{
UINT uSize = ATOWLEN(lpszShortType);
lpwszShortType = (LPWSTR)OleStdMalloc(sizeof(WCHAR) * uSize);
if (lpwszShortType)
{
ATOW(lpwszShortType, lpszShortType, uSize);
}
}
// NOTE - if OleStdMalloc fails, this routine must still go ahead and
// succeed as best as it can since there is no way to report failure.
BOOL fReturn = OleUIAddVerbMenuW(lpOleObj, lpwszShortType, hMenu, uPos,
uIDVerbMin, uIDVerbMax, bAddConvert, idConvert, lphMenu);
if (lpwszShortType)
OleStdFree((LPVOID)lpwszShortType);
return(fReturn);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIInsertObjectA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// lpszFile [in, out] on stack
// dwFlags [out]
// clsid [out]
// lpIStorage [out]
// ppvObj [out]
// sc [out]
// hMetaPict [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIInsertObjectA(LPOLEUIINSERTOBJECTA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
if (NULL != psA->lpszFile &&
(psA->cchFile <= 0 || psA->cchFile > MAX_PATH))
{
return(OLEUI_IOERR_CCHFILEINVALID);
}
// NULL is NOT valid for lpszFile
if (psA->lpszFile == NULL)
{
return(OLEUI_IOERR_LPSZFILEINVALID);
}
if (IsBadWritePtr(psA->lpszFile, psA->cchFile*sizeof(char)))
return(OLEUI_IOERR_LPSZFILEINVALID);
OLEUIINSERTOBJECTW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH], szFile[MAX_PATH];
memcpy(&sW, psA, sizeof(OLEUIINSERTOBJECTW));
if (psA->lpszCaption)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
if (psA->lpszFile)
{
ATOW(szFile, psA->lpszFile, MAX_PATH);
sW.lpszFile = szFile;
}
uRet = OleUIInsertObjectW(&sW);
if (psA->lpszFile)
{
WTOA(psA->lpszFile, sW.lpszFile, psA->cchFile);
}
memcpy(&psA->clsid, &sW.clsid, sizeof(CLSID));
psA->dwFlags = sW.dwFlags;
psA->lpIStorage = sW.lpIStorage;
psA->ppvObj = sW.ppvObj;
psA->sc = sW.sc;
psA->hMetaPict = sW.hMetaPict;
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIPasteSpecialA
//
// Synopsis: convers call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// arrPasteEntries [in] on heap
// arrPasteEntries[n].lpstrFormatName [in] on heap
// dwFlags [out]
// nSelectedIndex [out]
// fLink [out]
// hMetaPict [out]
// sizel [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIPasteSpecialA(LPOLEUIPASTESPECIALA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
// Validate PasteSpecial specific fields
if (NULL == psA->arrPasteEntries || IsBadReadPtr(psA->arrPasteEntries, psA->cPasteEntries * sizeof(OLEUIPASTEENTRYA)))
return(OLEUI_IOERR_ARRPASTEENTRIESINVALID);
OLEUIPASTESPECIALW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH];
uRet = OLEUI_ERR_LOCALMEMALLOC;
UINT uIndex;
memcpy(&sW, psA, sizeof(OLEUIPASTESPECIALW));
if (psA->lpszCaption)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
if (psA->cPasteEntries)
{
sW.arrPasteEntries = new OLEUIPASTEENTRYW[psA->cPasteEntries];
if (NULL == sW.arrPasteEntries)
{
return(uRet);
}
for (uIndex = psA->cPasteEntries; uIndex--;)
{
sW.arrPasteEntries[uIndex].lpstrFormatName = NULL;
sW.arrPasteEntries[uIndex].lpstrResultText = NULL;
}
for (uIndex = psA->cPasteEntries; uIndex--;)
{
sW.arrPasteEntries[uIndex].fmtetc = psA->arrPasteEntries[uIndex].fmtetc;
sW.arrPasteEntries[uIndex].dwFlags = psA->arrPasteEntries[uIndex].dwFlags;
sW.arrPasteEntries[uIndex].dwScratchSpace = psA->arrPasteEntries[uIndex].dwScratchSpace;
if (psA->arrPasteEntries[uIndex].lpstrFormatName)
{
UINT uLength = ATOWLEN(psA->arrPasteEntries[uIndex].lpstrFormatName);
sW.arrPasteEntries[uIndex].lpstrFormatName = new WCHAR[uLength];
if (NULL == sW.arrPasteEntries[uIndex].lpstrFormatName)
{
goto oom_error;
}
ATOW((WCHAR *)sW.arrPasteEntries[uIndex].lpstrFormatName,
psA->arrPasteEntries[uIndex].lpstrFormatName,
uLength);
}
if (psA->arrPasteEntries[uIndex].lpstrResultText)
{
UINT uLength = ATOWLEN(psA->arrPasteEntries[uIndex].lpstrResultText);
sW.arrPasteEntries[uIndex].lpstrResultText = new WCHAR[uLength];
if (NULL == sW.arrPasteEntries[uIndex].lpstrResultText)
{
goto oom_error;
}
ATOW((WCHAR *)sW.arrPasteEntries[uIndex].lpstrResultText,
psA->arrPasteEntries[uIndex].lpstrResultText,
uLength);
}
}
}
uRet = OleUIPasteSpecialW(&sW);
psA->lpSrcDataObj = sW.lpSrcDataObj;
psA->dwFlags = sW.dwFlags;
psA->nSelectedIndex = sW.nSelectedIndex;
psA->fLink = sW.fLink;
psA->hMetaPict = sW.hMetaPict;
psA->sizel = sW.sizel;
oom_error:
for (uIndex = psA->cPasteEntries; uIndex--;)
{
if (sW.arrPasteEntries[uIndex].lpstrFormatName)
{
delete[] (WCHAR*)sW.arrPasteEntries[uIndex].lpstrFormatName;
}
if (sW.arrPasteEntries[uIndex].lpstrResultText)
{
delete[] (WCHAR *)sW.arrPasteEntries[uIndex].lpstrResultText;
}
}
delete[] sW.arrPasteEntries;
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Class: WrappedIOleUILinkContainer
//
// Purpose: Wraps IOleUILinkContainerA with IOleUILinkContainerW methods
// so it can be passed on to Unicode methods within OLE2UI32.
//
// Interface: QueryInterface --
// AddRef --
// Release --
// GetNextLink --
// SetLinkUpdateOptions --
// GetLinkUpdateOptions --
// SetLinkSource -- requires string conversion
// GetLinkSource -- requires string conversion
// OpenLinkSource --
// UpdateLink --
// CancelLink --
// WrappedIOleUILinkContainer -- constructor
// ~WrappedIOleUILinkContainer -- destructor
//
// History: 11-04-94 stevebl Created
//
// Notes: This is a private interface wrapper. QueryInterface is not
// supported and the wrapped interface may not be used outside
// of the OLE2UI32 code.
//
//----------------------------------------------------------------------------
class WrappedIOleUILinkContainer: public IOleUILinkContainerW
{
public:
// *** IUnknown methods *** //
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG,AddRef) (THIS);
STDMETHOD_(ULONG,Release) (THIS);
// *** IOleUILinkContainer *** //
STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD dwLink);
STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD dwLink,
DWORD dwUpdateOpt);
STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD dwLink,
DWORD FAR* lpdwUpdateOpt);
STDMETHOD(SetLinkSource) (THIS_ DWORD dwLink, LPWSTR lpszDisplayName,
ULONG lenFileName, ULONG FAR* pchEaten, BOOL fValidateSource);
STDMETHOD(GetLinkSource) (THIS_ DWORD dwLink,
LPWSTR FAR* lplpszDisplayName, ULONG FAR* lplenFileName,
LPWSTR FAR* lplpszFullLinkType, LPWSTR FAR* lplpszShortLinkType,
BOOL FAR* lpfSourceAvailable, BOOL FAR* lpfIsSelected);
STDMETHOD(OpenLinkSource) (THIS_ DWORD dwLink);
STDMETHOD(UpdateLink) (THIS_ DWORD dwLink,
BOOL fErrorMessage, BOOL fErrorAction);
STDMETHOD(CancelLink) (THIS_ DWORD dwLink);
// *** Constructor and Destructor *** //
WrappedIOleUILinkContainer(IOleUILinkContainerA *pilc);
~WrappedIOleUILinkContainer();
private:
IOleUILinkContainerA * m_pilc;
ULONG m_uRefCount;
};
// *** IUnknown methods *** //
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
{
return(E_NOTIMPL);
}
ULONG STDMETHODCALLTYPE WrappedIOleUILinkContainer::AddRef()
{
return(m_uRefCount++);
}
ULONG STDMETHODCALLTYPE WrappedIOleUILinkContainer::Release()
{
ULONG uRet = --m_uRefCount;
if (0 == uRet)
{
delete(this);
}
return(uRet);
}
// *** IOleUILinkContainer *** //
DWORD STDMETHODCALLTYPE WrappedIOleUILinkContainer::GetNextLink(DWORD dwLink)
{
return(m_pilc->GetNextLink(dwLink));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::SetLinkUpdateOptions (DWORD dwLink,
DWORD dwUpdateOpt)
{
return(m_pilc->SetLinkUpdateOptions(dwLink, dwUpdateOpt));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::GetLinkUpdateOptions (DWORD dwLink,
DWORD FAR* lpdwUpdateOpt)
{
return(m_pilc->GetLinkUpdateOptions(dwLink, lpdwUpdateOpt));
}
//+---------------------------------------------------------------------------
//
// Member: WrappedIOleUILinkContainer::SetLinkSource
//
// Synopsis: forwards Unicode method call on to the ANSI version
//
// Arguments: [dwLink] -
// [lpszDisplayName] - [in] converted on stack
// [lenFileName] -
// [pchEaten] -
// [fValidateSource] -
//
// History: 11-04-94 stevebl Created
//
//----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::SetLinkSource (DWORD dwLink, LPWSTR lpszDisplayName,
ULONG lenFileName, ULONG FAR* pchEaten, BOOL fValidateSource)
{
char szDisplayName[MAX_PATH];
char * lpszDisplayNameA;
if (lpszDisplayName)
{
WTOA(szDisplayName, lpszDisplayName, MAX_PATH);
lpszDisplayNameA = szDisplayName;
}
else
lpszDisplayNameA = NULL;
return(m_pilc->SetLinkSource(dwLink, lpszDisplayNameA, lenFileName, pchEaten, fValidateSource));
}
//+---------------------------------------------------------------------------
//
// Member: WrappedIOleUILinkContainer::GetLinkSource
//
// Synopsis: forwards Unicode method call on to the ANSI version
//
// Arguments: [dwLink] -
// [lplpszDisplayName] - [out] converted on heap
// [lplenFileName] -
// [lplpszFullLinkType] - [out] converted on heap
// [lplpszShortLinkType] - [out] converted on heap
// [lpfSourceAvailable] -
// [lpfIsSelected] -
//
// History: 11-04-94 stevebl Created
//
//----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::GetLinkSource (DWORD dwLink,
LPWSTR FAR* lplpszDisplayName, ULONG FAR* lplenFileName,
LPWSTR FAR* lplpszFullLinkType, LPWSTR FAR* lplpszShortLinkType,
BOOL FAR* lpfSourceAvailable, BOOL FAR* lpfIsSelected)
{
LPSTR lpszDisplayName = NULL;
LPSTR lpszFullLinkType = NULL;
LPSTR lpszShortLinkType = NULL;
LPSTR * lplpszDisplayNameA = NULL;
LPSTR * lplpszFullLinkTypeA = NULL;
LPSTR * lplpszShortLinkTypeA = NULL;
if (lplpszDisplayName)
{
lplpszDisplayNameA = &lpszDisplayName;
}
if (lplpszFullLinkType)
{
lplpszFullLinkTypeA = &lpszFullLinkType;
}
if (lplpszShortLinkType)
{
lplpszShortLinkTypeA = &lpszShortLinkType;
}
HRESULT hrReturn = m_pilc->GetLinkSource(dwLink,
lplpszDisplayNameA,
lplenFileName,
lplpszFullLinkTypeA,
lplpszShortLinkTypeA,
lpfSourceAvailable,
lpfIsSelected);
if (lplpszDisplayName)
{
*lplpszDisplayName = NULL;
if (lpszDisplayName)
{
UINT uLen = ATOWLEN(lpszDisplayName);
*lplpszDisplayName = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszDisplayName)
{
ATOW(*lplpszDisplayName, lpszDisplayName, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszDisplayName);
}
}
if (lplpszFullLinkType)
{
*lplpszFullLinkType = NULL;
if (lpszFullLinkType)
{
UINT uLen = ATOWLEN(lpszFullLinkType);
*lplpszFullLinkType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszFullLinkType)
{
ATOW(*lplpszFullLinkType, lpszFullLinkType, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszFullLinkType);
}
}
if (lplpszShortLinkType)
{
*lplpszShortLinkType = NULL;
if (lpszShortLinkType)
{
UINT uLen = ATOWLEN(lpszShortLinkType);
*lplpszShortLinkType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszShortLinkType)
{
ATOW(*lplpszShortLinkType, lpszShortLinkType, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszShortLinkType);
}
}
return(hrReturn);
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::OpenLinkSource (DWORD dwLink)
{
return(m_pilc->OpenLinkSource(dwLink));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::UpdateLink (DWORD dwLink,
BOOL fErrorMessage, BOOL fErrorAction)
{
return(m_pilc->UpdateLink(dwLink, fErrorMessage, fErrorAction));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkContainer::CancelLink (DWORD dwLink)
{
return(m_pilc->CancelLink(dwLink));
}
WrappedIOleUILinkContainer::WrappedIOleUILinkContainer(IOleUILinkContainerA *pilc)
{
m_pilc = pilc;
m_pilc->AddRef();
m_uRefCount=1;
}
WrappedIOleUILinkContainer::~WrappedIOleUILinkContainer()
{
m_pilc->Release();
}
//+---------------------------------------------------------------------------
//
// Function: OleUIEditLinksA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Notes: Uses the WrappedIOleUILinkContainer interface wrapper.
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// dwFlags [out]
// lpOleUILinkContainer [in] wrapped interface
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIEditLinksA(LPOLEUIEDITLINKSA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
uRet = OLEUI_SUCCESS;
// Validate interface.
if (NULL == psA->lpOleUILinkContainer)
{
uRet = OLEUI_ELERR_LINKCNTRNULL;
}
else if(IsBadReadPtr(psA->lpOleUILinkContainer, sizeof(IOleUILinkContainerA)))
{
uRet = OLEUI_ELERR_LINKCNTRINVALID;
}
if (OLEUI_SUCCESS != uRet)
{
return(uRet);
}
OLEUIEDITLINKSW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH];
uRet = OLEUI_ERR_LOCALMEMALLOC;
memcpy(&sW, psA, sizeof(OLEUIEDITLINKSW));
if (psA->lpszCaption)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
sW.lpOleUILinkContainer = new WrappedIOleUILinkContainer(psA->lpOleUILinkContainer);
if (NULL == sW.lpOleUILinkContainer)
{
return(uRet);
}
uRet = OleUIEditLinksW(&sW);
psA->dwFlags = sW.dwFlags;
sW.lpOleUILinkContainer->Release();
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIChangeIconA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// szIconExe [in] array embedded in structure
// dwFlags [out]
// hMetaPict [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIChangeIconA(LPOLEUICHANGEICONA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
OLEUICHANGEICONW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH];
memcpy(&sW, psA, sizeof(OLEUICHANGEICONA));
sW.cbStruct = sizeof(OLEUICHANGEICONW);
if (psA->lpszCaption)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
ATOW(sW.szIconExe, psA->szIconExe, MAX_PATH);
sW.cchIconExe = psA->cchIconExe;
uRet = OleUIChangeIconW(&sW);
psA->dwFlags = sW.dwFlags;
psA->hMetaPict = sW.hMetaPict;
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIConvertA
//
// Synopsis: converts a call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// lpszUserType [in] on heap
// [out] always freed and returned as NULL
// lpszDefLabel [in] on heap
// lpszDefLabel [out] always freed and returned as NULL
// dwFlags [out]
// clsidNew [out]
// dvAspect [out]
// hMetaPict [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIConvertA(LPOLEUICONVERTA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
if ((NULL != psA->lpszUserType)
&& (IsBadReadPtr(psA->lpszUserType, 1)))
return(OLEUI_CTERR_STRINGINVALID);
if ( (NULL != psA->lpszDefLabel)
&& (IsBadReadPtr(psA->lpszDefLabel, 1)) )
return(OLEUI_CTERR_STRINGINVALID);
OLEUICONVERTW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH];
uRet = OLEUI_ERR_LOCALMEMALLOC;
memcpy(&sW, psA, sizeof(OLEUICONVERTW));
if (psA->lpszCaption)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
sW.lpszUserType = sW.lpszDefLabel = NULL;
if (psA->lpszUserType)
{
UINT uLen = ATOWLEN(psA->lpszUserType);
sW.lpszUserType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (!sW.lpszUserType)
{
goto oom_error;
}
ATOW(sW.lpszUserType, psA->lpszUserType, uLen);
}
if (psA->lpszDefLabel)
{
UINT uLen = ATOWLEN(psA->lpszDefLabel);
sW.lpszDefLabel = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (!sW.lpszDefLabel)
{
goto oom_error;
}
ATOW(sW.lpszDefLabel, psA->lpszDefLabel, uLen);
}
uRet = OleUIConvertW(&sW);
psA->dwFlags = sW.dwFlags;
memcpy(&psA->clsidNew, &sW.clsidNew, sizeof(CLSID));
psA->dvAspect = sW.dvAspect;
psA->hMetaPict = sW.hMetaPict;
psA->fObjectsIconChanged = sW.fObjectsIconChanged;
oom_error:
if (sW.lpszUserType)
{
OleStdFree((LPVOID)sW.lpszUserType);
}
if (sW.lpszDefLabel)
{
OleStdFree((LPVOID)sW.lpszDefLabel);
}
if (psA->lpszUserType)
{
OleStdFree((LPVOID)psA->lpszUserType);
psA->lpszUserType = NULL;
}
if (psA->lpszDefLabel)
{
OleStdFree((LPVOID)psA->lpszDefLabel);
psA->lpszDefLabel = NULL;
}
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIBusyA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// dwFlags [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIBusyA(LPOLEUIBUSYA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
OLEUIBUSYW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH];
memcpy(&sW, psA, sizeof(OLEUIBUSYW));
if (psA->lpszCaption)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
uRet = OleUIBusyW(&sW);
psA->dwFlags = sW.dwFlags;
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIUpdateLinksA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [lpOleUILinkCntr] - [in] wrapped with Unicode version
// [hwndParent] -
// [lpszTitle] - [in] on stack
// [cLinks] -
//
// History: 11-04-94 stevebl Created
//
//----------------------------------------------------------------------------
STDAPI_(BOOL) OleUIUpdateLinksA(LPOLEUILINKCONTAINERA lpOleUILinkCntr,
HWND hwndParent, LPSTR lpszTitle, int cLinks)
{
WrappedIOleUILinkContainer * lpWrappedOleUILinkCntr = NULL;
if (NULL != lpszTitle && IsBadReadPtr(lpszTitle, 1))
return(FALSE);
if (NULL == lpOleUILinkCntr || IsBadReadPtr(lpOleUILinkCntr, sizeof(IOleUILinkContainerA)))
return(FALSE);
lpWrappedOleUILinkCntr = new WrappedIOleUILinkContainer(lpOleUILinkCntr);
if (NULL == lpWrappedOleUILinkCntr)
return(FALSE); // ran out of memory
WCHAR wszTitle[MAX_PATH];
WCHAR *lpwszTitle;
if (lpszTitle)
{
ATOW(wszTitle, lpszTitle, MAX_PATH);
lpwszTitle = wszTitle;
}
else
lpwszTitle = NULL;
BOOL fReturn = OleUIUpdateLinksW(lpWrappedOleUILinkCntr, hwndParent, lpwszTitle, cLinks);
lpWrappedOleUILinkCntr->Release();
return(fReturn);
}
//+---------------------------------------------------------------------------
//
// Class: WrappedIOleUIObjInfo
//
// Purpose: Wraps IOleUIObjInfoA with IOleUIObjInfoW methods
// so it can be passed on to Unicode methods within OLE2UI32.
//
// Interface: QueryInterface --
// AddRef --
// Release --
// GetObjectInfo -- requires string conversion
// GetConvertInfo --
// ConvertObject --
// GetViewInfo --
// SetViewInfo --
// WrappedIOleUIObjInfo -- constructor
// ~WrappedIOleUIObjInfo -- destructor
//
// History: 11-08-94 stevebl Created
//
// Notes: This is a private interface wrapper. QueryInterface is not
// supported and the wrapped interface may not be used outside
// of the OLE2UI32 code.
//
//----------------------------------------------------------------------------
class WrappedIOleUIObjInfo: public IOleUIObjInfoW
{
public:
// *** IUnknown methods *** //
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG,AddRef) (THIS);
STDMETHOD_(ULONG,Release) (THIS);
// *** extra for General Properties *** //
STDMETHOD(GetObjectInfo) (THIS_ DWORD dwObject,
DWORD FAR* lpdwObjSize, LPWSTR FAR* lplpszLabel,
LPWSTR FAR* lplpszType, LPWSTR FAR* lplpszShortType,
LPWSTR FAR* lplpszLocation);
STDMETHOD(GetConvertInfo) (THIS_ DWORD dwObject,
CLSID FAR* lpClassID, WORD FAR* lpwFormat,
CLSID FAR* lpConvertDefaultClassID,
LPCLSID FAR* lplpClsidExclude, UINT FAR* lpcClsidExclude);
STDMETHOD(ConvertObject) (THIS_ DWORD dwObject, REFCLSID clsidNew);
// *** extra for View Properties *** //
STDMETHOD(GetViewInfo) (THIS_ DWORD dwObject,
HGLOBAL FAR* phMetaPict, DWORD* pdvAspect, int* pnCurrentScale);
STDMETHOD(SetViewInfo) (THIS_ DWORD dwObject,
HGLOBAL hMetaPict, DWORD dvAspect,
int nCurrentScale, BOOL bRelativeToOrig);
// *** Constructor and Destructor *** //
WrappedIOleUIObjInfo(IOleUIObjInfoA * pioi);
~WrappedIOleUIObjInfo();
private:
IOleUIObjInfoA * m_pioi;
ULONG m_uRefCount;
};
// *** IUnknown methods *** //
HRESULT STDMETHODCALLTYPE WrappedIOleUIObjInfo::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
{
return(E_NOTIMPL);
}
ULONG STDMETHODCALLTYPE WrappedIOleUIObjInfo::AddRef()
{
return(m_uRefCount++);
}
ULONG STDMETHODCALLTYPE WrappedIOleUIObjInfo::Release()
{
ULONG uRet = --m_uRefCount;
if (0 == uRet)
{
delete(this);
}
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Member: WrappedIOleUIObjInfo::GetObjectInfo
//
// Synopsis: forwards Unicode method call on to the ANSI version
//
// Arguments: [dwObject] -
// [lpdwObjSize] -
// [lplpszLabel] - [out] converted on heap
// [lplpszType] - [out] converted on heap
// [lplpszShortType] - [out] converted on heap
// [lplpszLocation] - [out] converted on heap
//
// History: 11-09-94 stevebl Created
//
//----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE WrappedIOleUIObjInfo::GetObjectInfo(DWORD dwObject,
DWORD FAR* lpdwObjSize, LPWSTR FAR* lplpszLabel,
LPWSTR FAR* lplpszType, LPWSTR FAR* lplpszShortType,
LPWSTR FAR* lplpszLocation)
{
LPSTR lpszLabel = NULL;
LPSTR lpszType = NULL;
LPSTR lpszShortType = NULL;
LPSTR lpszLocation = NULL;
LPSTR * lplpszLabelA = NULL;
LPSTR * lplpszTypeA = NULL;
LPSTR * lplpszShortTypeA = NULL;
LPSTR * lplpszLocationA = NULL;
if (lplpszLabel)
{
lplpszLabelA = &lpszLabel;
}
if (lplpszType)
{
lplpszTypeA = &lpszType;
}
if (lplpszShortType)
{
lplpszShortTypeA = &lpszShortType;
}
if (lplpszLocation)
{
lplpszLocationA = &lpszLocation;
}
HRESULT hrReturn = m_pioi->GetObjectInfo(dwObject,
lpdwObjSize,
lplpszLabelA,
lplpszTypeA,
lplpszShortTypeA,
lplpszLocationA);
if (lplpszLabel)
{
*lplpszLabel = NULL;
if (lpszLabel)
{
UINT uLen = ATOWLEN(lpszLabel);
*lplpszLabel = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszLabel)
{
ATOW(*lplpszLabel, lpszLabel, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszLabel);
}
}
if (lplpszType)
{
*lplpszType = NULL;
if (lpszType)
{
UINT uLen = ATOWLEN(lpszType);
*lplpszType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszType)
{
ATOW(*lplpszType, lpszType, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszType);
}
}
if (lplpszShortType)
{
*lplpszShortType = NULL;
if (lpszShortType)
{
UINT uLen = ATOWLEN(lpszShortType);
*lplpszShortType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszShortType)
{
ATOW(*lplpszShortType, lpszShortType, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszShortType);
}
}
if (lplpszLocation)
{
*lplpszLocation = NULL;
if (lpszLocation)
{
UINT uLen = ATOWLEN(lpszLocation);
*lplpszLocation = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszLocation)
{
ATOW(*lplpszLocation, lpszLocation, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszLocation);
}
}
return(hrReturn);
}
HRESULT STDMETHODCALLTYPE WrappedIOleUIObjInfo::GetConvertInfo(DWORD dwObject,
CLSID FAR* lpClassID, WORD FAR* lpwFormat,
CLSID FAR* lpConvertDefaultClassID,
LPCLSID FAR* lplpClsidExclude, UINT FAR* lpcClsidExclude)
{
return(m_pioi->GetConvertInfo(dwObject,
lpClassID,
lpwFormat,
lpConvertDefaultClassID,
lplpClsidExclude,
lpcClsidExclude));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUIObjInfo::ConvertObject(DWORD dwObject, REFCLSID clsidNew)
{
return(m_pioi->ConvertObject(dwObject, clsidNew));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUIObjInfo::GetViewInfo(DWORD dwObject,
HGLOBAL FAR* phMetaPict, DWORD* pdvAspect, int* pnCurrentScale)
{
return(m_pioi->GetViewInfo(dwObject, phMetaPict, pdvAspect, pnCurrentScale));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUIObjInfo::SetViewInfo(DWORD dwObject,
HGLOBAL hMetaPict, DWORD dvAspect,
int nCurrentScale, BOOL bRelativeToOrig)
{
return(m_pioi->SetViewInfo(dwObject, hMetaPict, dvAspect, nCurrentScale, bRelativeToOrig));
}
WrappedIOleUIObjInfo::WrappedIOleUIObjInfo(IOleUIObjInfoA *pioi)
{
m_pioi = pioi;
m_pioi->AddRef();
m_uRefCount=1;
}
WrappedIOleUIObjInfo::~WrappedIOleUIObjInfo()
{
m_pioi->Release();
}
//+---------------------------------------------------------------------------
//
// Class: WrappedIOleUILinkInfo
//
// Purpose: Wraps IOleUILinkInfoA with IOleUILinkInfoW methods
// so it can be passed on to Unicode methods within OLE2UI32.
//
// Interface: QueryInterface --
// AddRef --
// Release --
// GetNextLink --
// SetLinkUpdateOptions --
// GetLinkUpdateOptions --
// SetLinkSource -- requires string conversion
// GetLinkSource -- requires string conversion
// OpenLinkSource --
// UpdateLink --
// CancelLink --
// GetLastUpdate --
// WrappedIOleUILinkInfo -- constructor
// ~WrappedIOleUILinkInfo -- destructor
//
// History: 11-08-94 stevebl Created
//
// Notes: This is a private interface wrapper. QueryInterface is not
// supported and the wrapped interface may not be used outside
// of the OLE2UI32 code.
//
//----------------------------------------------------------------------------
class WrappedIOleUILinkInfo: public IOleUILinkInfoW
{
public:
// *** IUnknown methods *** //
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG,AddRef) (THIS);
STDMETHOD_(ULONG,Release) (THIS);
// *** IOleUILinkContainer *** //
STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD dwLink);
STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD dwLink,
DWORD dwUpdateOpt);
STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD dwLink,
DWORD FAR* lpdwUpdateOpt);
STDMETHOD(SetLinkSource) (THIS_ DWORD dwLink, LPWSTR lpszDisplayName,
ULONG lenFileName, ULONG FAR* pchEaten, BOOL fValidateSource);
STDMETHOD(GetLinkSource) (THIS_ DWORD dwLink,
LPWSTR FAR* lplpszDisplayName, ULONG FAR* lplenFileName,
LPWSTR FAR* lplpszFullLinkType, LPWSTR FAR* lplpszShortLinkType,
BOOL FAR* lpfSourceAvailable, BOOL FAR* lpfIsSelected);
STDMETHOD(OpenLinkSource) (THIS_ DWORD dwLink);
STDMETHOD(UpdateLink) (THIS_ DWORD dwLink,
BOOL fErrorMessage, BOOL fErrorAction);
STDMETHOD(CancelLink) (THIS_ DWORD dwLink);
// *** extra for Link Properties ***//
STDMETHOD(GetLastUpdate) (THIS_ DWORD dwLink,
FILETIME FAR* lpLastUpdate);
// *** Constructor and Destructor *** //
WrappedIOleUILinkInfo(IOleUILinkInfoA *pili);
~WrappedIOleUILinkInfo();
private:
IOleUILinkInfoA * m_pili;
ULONG m_uRefCount;
};
// *** IUnknown methods *** //
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
{
return(E_NOTIMPL);
}
ULONG STDMETHODCALLTYPE WrappedIOleUILinkInfo::AddRef()
{
return(m_uRefCount++);
}
ULONG STDMETHODCALLTYPE WrappedIOleUILinkInfo::Release()
{
ULONG uRet = --m_uRefCount;
if (0 == uRet)
{
delete(this);
}
return(uRet);
}
// *** IOleUILinkInfo *** //
DWORD STDMETHODCALLTYPE WrappedIOleUILinkInfo::GetNextLink(DWORD dwLink)
{
return(m_pili->GetNextLink(dwLink));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::SetLinkUpdateOptions (DWORD dwLink,
DWORD dwUpdateOpt)
{
return(m_pili->SetLinkUpdateOptions(dwLink, dwUpdateOpt));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::GetLinkUpdateOptions (DWORD dwLink,
DWORD FAR* lpdwUpdateOpt)
{
return(m_pili->GetLinkUpdateOptions(dwLink, lpdwUpdateOpt));
}
//+---------------------------------------------------------------------------
//
// Member: WrappedIOleUILinkInfo::SetLinkSource
//
// Synopsis: forwards Unicode method call on to the ANSI version
//
// Arguments: [dwLink] -
// [lpszDisplayName] - [in] converted on stack
// [lenFileName] -
// [pchEaten] -
// [fValidateSource] -
//
// History: 11-04-94 stevebl Created
//
//----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::SetLinkSource (DWORD dwLink, LPWSTR lpszDisplayName,
ULONG lenFileName, ULONG FAR* pchEaten, BOOL fValidateSource)
{
char szDisplayName[MAX_PATH];
char * lpszDisplayNameA;
if (lpszDisplayName)
{
WTOA(szDisplayName, lpszDisplayName, MAX_PATH);
lpszDisplayNameA = szDisplayName;
}
else
lpszDisplayNameA = NULL;
return(m_pili->SetLinkSource(dwLink, lpszDisplayNameA, lenFileName, pchEaten, fValidateSource));
}
//+---------------------------------------------------------------------------
//
// Member: WrappedIOleUILinkInfo::GetLinkSource
//
// Synopsis: forwards Unicode method call on to the ANSI version
//
// Arguments: [dwLink] -
// [lplpszDisplayName] - [out] converted on heap
// [lplenFileName] -
// [lplpszFullLinkType] - [out] converted on heap
// [lplpszShortLinkType] - [out] converted on heap
// [lpfSourceAvailable] -
// [lpfIsSelected] -
//
// History: 11-04-94 stevebl Created
//
//----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::GetLinkSource (DWORD dwLink,
LPWSTR FAR* lplpszDisplayName, ULONG FAR* lplenFileName,
LPWSTR FAR* lplpszFullLinkType, LPWSTR FAR* lplpszShortLinkType,
BOOL FAR* lpfSourceAvailable, BOOL FAR* lpfIsSelected)
{
LPSTR lpszDisplayName = NULL;
LPSTR lpszFullLinkType = NULL;
LPSTR lpszShortLinkType = NULL;
LPSTR * lplpszDisplayNameA = NULL;
LPSTR * lplpszFullLinkTypeA = NULL;
LPSTR * lplpszShortLinkTypeA = NULL;
if (lplpszDisplayName)
{
lplpszDisplayNameA = &lpszDisplayName;
}
if (lplpszFullLinkType)
{
lplpszFullLinkTypeA = &lpszFullLinkType;
}
if (lplpszShortLinkType)
{
lplpszShortLinkTypeA = &lpszShortLinkType;
}
HRESULT hrReturn = m_pili->GetLinkSource(dwLink,
lplpszDisplayNameA,
lplenFileName,
lplpszFullLinkTypeA,
lplpszShortLinkTypeA,
lpfSourceAvailable,
lpfIsSelected);
if (lplpszDisplayName)
{
*lplpszDisplayName = NULL;
if (lpszDisplayName)
{
UINT uLen = ATOWLEN(lpszDisplayName);
*lplpszDisplayName = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszDisplayName)
{
ATOW(*lplpszDisplayName, lpszDisplayName, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszDisplayName);
}
}
if (lplpszFullLinkType)
{
*lplpszFullLinkType = NULL;
if (lpszFullLinkType)
{
UINT uLen = ATOWLEN(lpszFullLinkType);
*lplpszFullLinkType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszFullLinkType)
{
ATOW(*lplpszFullLinkType, lpszFullLinkType, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszFullLinkType);
}
}
if (lplpszShortLinkType)
{
*lplpszShortLinkType = NULL;
if (lpszShortLinkType)
{
UINT uLen = ATOWLEN(lpszShortLinkType);
*lplpszShortLinkType = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (*lplpszShortLinkType)
{
ATOW(*lplpszShortLinkType, lpszShortLinkType, uLen);
}
else
hrReturn = E_OUTOFMEMORY;
OleStdFree((LPVOID)lpszShortLinkType);
}
}
return(hrReturn);
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::OpenLinkSource (DWORD dwLink)
{
return(m_pili->OpenLinkSource(dwLink));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::UpdateLink (DWORD dwLink,
BOOL fErrorMessage, BOOL fErrorAction)
{
return(m_pili->UpdateLink(dwLink, fErrorMessage, fErrorAction));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::CancelLink (DWORD dwLink)
{
return(m_pili->CancelLink(dwLink));
}
HRESULT STDMETHODCALLTYPE WrappedIOleUILinkInfo::GetLastUpdate (DWORD dwLink,
FILETIME FAR* lpLastUpdate)
{
return(m_pili->GetLastUpdate(dwLink, lpLastUpdate));
}
WrappedIOleUILinkInfo::WrappedIOleUILinkInfo(IOleUILinkInfoA *pili)
{
m_pili = pili;
m_pili->AddRef();
m_uRefCount=1;
}
WrappedIOleUILinkInfo::~WrappedIOleUILinkInfo()
{
m_pili->Release();
}
//+---------------------------------------------------------------------------
//
// Function: OleUIObjectPropertiesA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpPS [in]
// lpObjInfo [in] wrapped with Unicode interface
// lpLinkInfo [in] wrapped with Unicode interface
// lpGP [in] (no data conversion, only type conversion)
// lpVP [in] (no data conversion, only type conversion)
// lpLP [in] (no data conversion, only type conversion)
//
// dwFlags [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIObjectPropertiesA(LPOLEUIOBJECTPROPSA psA)
{
if (NULL == psA)
{
return(OLEUI_ERR_STRUCTURENULL);
}
if (IsBadWritePtr(psA, sizeof(OLEUIOBJECTPROPSA)))
return OLEUI_ERR_STRUCTUREINVALID;
LPOLEUIOBJECTPROPSW psW;
UINT uRet = OLEUI_ERR_LOCALMEMALLOC;
if (NULL == psA->lpObjInfo)
{
return(OLEUI_OPERR_OBJINFOINVALID);
}
if (IsBadReadPtr(psA->lpObjInfo, sizeof(IOleUIObjInfoA)))
{
return(OLEUI_OPERR_OBJINFOINVALID);
}
if (psA->dwFlags & OPF_OBJECTISLINK)
{
if (NULL == psA->lpLinkInfo)
{
return(OLEUI_OPERR_LINKINFOINVALID);
}
if (IsBadReadPtr(psA->lpLinkInfo, sizeof(IOleUILinkInfoA)))
{
return(OLEUI_OPERR_LINKINFOINVALID);
}
}
BOOL fWrappedIOleUILinkInfo = FALSE;
psW = (LPOLEUIOBJECTPROPSW) OleStdMalloc(sizeof(OLEUIOBJECTPROPSW));
if (NULL != psW)
{
memcpy(psW, psA, sizeof(OLEUIOBJECTPROPSW));
psW->lpObjInfo = new WrappedIOleUIObjInfo(psA->lpObjInfo);
if (NULL == psW->lpObjInfo)
{
OleStdFree(psW);
return(uRet);
}
if (psW->dwFlags & OPF_OBJECTISLINK)
{
psW->lpLinkInfo = new WrappedIOleUILinkInfo(psA->lpLinkInfo);
if (NULL == psW->lpLinkInfo)
{
psW->lpObjInfo->Release();
OleStdFree(psW);
return(uRet);
}
fWrappedIOleUILinkInfo = TRUE;
}
uRet = InternalObjectProperties(psW, FALSE);
psA->dwFlags = psW->dwFlags;
psW->lpObjInfo->Release();
if (fWrappedIOleUILinkInfo)
{
psW->lpLinkInfo->Release();
}
OleStdFree(psW);
}
return(uRet);
}
//+---------------------------------------------------------------------------
//
// Function: OleUIChangeSourceA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [psA] - ANSI structure
//
// History: 11-04-94 stevebl Created
//
// Structure members converted or passed back out (everything is passed in):
// lpszCaption [in] on stack
// lpszTemplate [in] on stack
// lpszDisplayName [in, out] on heap
// lpszFrom [out] on heap
// lpszTo [out] on heap
// lpOleUILinkContainer [in] wrapped interface
// dwFlags [out]
// nFileLength [out]
//
//----------------------------------------------------------------------------
STDAPI_(UINT) OleUIChangeSourceA(LPOLEUICHANGESOURCEA psA)
{
UINT uRet = UStandardValidation((LPOLEUISTANDARD)psA, sizeof(*psA), NULL);
// If the caller is using a private template, UStandardValidation will
// always return OLEUI_ERR_FINDTEMPLATEFAILURE here. This is because we
// haven't converted the template name to UNICODE yet, so the
// FindResource call in UStandardValidation won't find the caller's
// template. This is OK for two reasons: (1) it's the last thing that
// UStandardValidation checks so by this time it's basically done its
// job, and (2) UStandardValidation will be called again when we forward
// this call on to the Unicode version.
if (OLEUI_SUCCESS != uRet && OLEUI_ERR_FINDTEMPLATEFAILURE != uRet)
return uRet;
// lpszFrom and lpszTo must be NULL (they are out only)
if (psA->lpszFrom != NULL)
{
return(OLEUI_CSERR_FROMNOTNULL);
}
if (psA->lpszTo != NULL)
{
return(OLEUI_CSERR_TONOTNULL);
}
// lpszDisplayName must be valid or NULL
if (psA->lpszDisplayName != NULL &&
IsBadReadPtr(psA->lpszDisplayName, 1))
{
return(OLEUI_CSERR_SOURCEINVALID);
}
OLEUICHANGESOURCEW sW;
WCHAR szCaption[MAX_PATH], szTemplate[MAX_PATH];
uRet = OLEUI_ERR_LOCALMEMALLOC;
memcpy(&sW, psA, sizeof(OLEUICHANGESOURCEW));
if (psA->lpszCaption != NULL)
{
ATOW(szCaption, psA->lpszCaption, MAX_PATH);
sW.lpszCaption = szCaption;
}
if (0 != HIWORD(psA->lpszTemplate))
{
ATOW(szTemplate, psA->lpszTemplate, MAX_PATH);
sW.lpszTemplate = szTemplate;
}
if (psA->lpszDisplayName)
{
UINT uLen = ATOWLEN(psA->lpszDisplayName);
sW.lpszDisplayName = (LPWSTR)OleStdMalloc(uLen * sizeof(WCHAR));
if (!sW.lpszDisplayName)
{
return(uRet);
}
ATOW(sW.lpszDisplayName, psA->lpszDisplayName, uLen);
}
if (NULL != psA->lpOleUILinkContainer)
{
if (IsBadReadPtr(psA->lpOleUILinkContainer, sizeof(IOleUILinkContainerA)))
{
return(OLEUI_CSERR_LINKCNTRINVALID);
}
sW.lpOleUILinkContainer = new WrappedIOleUILinkContainer(psA->lpOleUILinkContainer);
if (NULL == sW.lpOleUILinkContainer)
{
return(uRet);
}
}
uRet = OleUIChangeSourceW(&sW);
if (psA->lpszDisplayName)
{
OleStdFree((LPVOID)psA->lpszDisplayName);
psA->lpszDisplayName = NULL;
}
if (sW.lpszDisplayName)
{
UINT uLen = WTOALEN(sW.lpszDisplayName);
psA->lpszDisplayName = (LPSTR)OleStdMalloc(uLen * sizeof(char));
if (!psA->lpszDisplayName)
{
uRet = OLEUI_ERR_LOCALMEMALLOC;
}
else
{
WTOA(psA->lpszDisplayName, sW.lpszDisplayName, uLen);
}
OleStdFree((LPVOID)sW.lpszDisplayName);
}
if (sW.lpszFrom)
{
UINT uLen = WTOALEN(sW.lpszFrom);
psA->lpszFrom = (LPSTR)OleStdMalloc(uLen * sizeof(char));
if (!psA->lpszFrom)
{
uRet = OLEUI_ERR_LOCALMEMALLOC;
}
else
{
WTOA(psA->lpszFrom, sW.lpszFrom, uLen);
}
OleStdFree((LPVOID)sW.lpszFrom);
}
if (sW.lpszTo)
{
UINT uLen = WTOALEN(sW.lpszTo);
psA->lpszTo = (LPSTR)OleStdMalloc(uLen * sizeof(char));
if (!psA->lpszTo)
{
uRet = OLEUI_ERR_LOCALMEMALLOC;
}
else
{
WTOA(psA->lpszTo, sW.lpszTo, uLen);
}
OleStdFree((LPVOID)sW.lpszTo);
}
psA->dwFlags = sW.dwFlags;
psA->nFileLength = sW.nFileLength;
if (NULL != sW.lpOleUILinkContainer)
{
sW.lpOleUILinkContainer->Release();
}
return(uRet);
}
int OleUIPromptUserInternal(int nTemplate, HWND hwndParent, LPTSTR szTitle, va_list arglist);
//+---------------------------------------------------------------------------
//
// Function: OleUIPromptUserA
//
// Synopsis: converts call to ANSI version into call to Unicode version
//
// Arguments: [nTemplate] - template ID
// [hwndParent] - parent's HWND
// [lpszTitle] - title of the window
// [...] - variable argument list
//
// History: 11-30-94 stevebl Created
//
// Notes: The first parameter passed in by this function is always the
// title for the dialog. It must be converted to Unicode before
// forwarding the call. The other parameters do not need to
// be converted because the template ID will indicate the dialog
// that contains the correct wsprintf formatting string for
// converting the other ANSI parameters to Unicode when the
// function calls wsprintf to build it's text.
//
//----------------------------------------------------------------------------
int FAR CDECL OleUIPromptUserA(int nTemplate, HWND hwndParent, ...)
{
WCHAR wszTemp[MAX_PATH];
WCHAR * wszTitle = NULL;
va_list arglist;
va_start(arglist, hwndParent);
LPSTR szTitle = va_arg(arglist, LPSTR);
if (szTitle != NULL)
{
ATOW(wszTemp, szTitle, MAX_PATH);
wszTitle = wszTemp;
}
int nRet = OleUIPromptUserInternal(nTemplate, hwndParent, wszTitle, arglist);
va_end(arglist);
return(nRet);
}
#else // UNICODE not defined
// Stubbed out Wide entry points
STDAPI_(BOOL) OleUIAddVerbMenuW(LPOLEOBJECT lpOleObj, LPCWSTR lpszShortType,
HMENU hMenu, UINT uPos, UINT uIDVerbMin, UINT uIDVerbMax,
BOOL bAddConvert, UINT idConvert, HMENU FAR *lphMenu)
{
// BUGBUG - there is really no way to specify an error return code
return(FALSE);
}
//+---------------------------------------------------------------------------
//
// Function: ReturnError
//
// Synopsis: Used to stub out the following entry points:
// OleUIInsertObjectW
// OleUIPasteSpecialW
// OleUIEditLinksW
// OleUIChangeIconW
// OleUIConvertW
// OleUIBusyW
// OleUIObjectPropertiesW
// OleUIChangeSourceW
//
// Returns: OLEUI_ERR_DIALOGFAILURE
//
// History: 12-29-94 stevebl Created
//
// Notes: The entry points listed above are all mapped to this function
// in the Chicago version of OLEDLG.DEF.
//
//----------------------------------------------------------------------------
STDAPI_(UINT) ReturnError(void * p)
{
return(OLEUI_ERR_DIALOGFAILURE);
}
STDAPI_(BOOL) OleUIUpdateLinksW(LPOLEUILINKCONTAINERW lpOleUILinkCntr,
HWND hwndParent, LPWSTR lpszTitle, int cLinks)
{
return(FALSE);
}
int FAR CDECL OleUIPromptUserW(int nTemplate, HWND hwndParent, LPWSTR lpszTitle, ...)
{
return(2); // same as if user had cancelled the dialog
}
#endif // UNICODE