|
|
//+---------------------------------------------------------------------------
//
// 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(PtrToUlong(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(PtrToUlong(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(PtrToUlong(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(PtrToUlong(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(PtrToUlong(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(PtrToUlong(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(PtrToUlong(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) { 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
|