|
|
/*
* persist.cpp - IPersist, IPersistFile, and IPersistStream implementations for * CConfLink class. * * Taken from URL code - very similar to DavidDi's original code * * Created: ChrisPi 9-11-95 * */
/* Headers
**********/
#include "precomp.h"
#include "CLinkID.h"
#include "clrefcnt.hpp"
#include "clenumft.hpp"
#include "clCnfLnk.hpp"
/* Global Constants
*******************/
#pragma data_seg(DATA_SEG_READ_ONLY)
static const UINT g_ucMaxNameLen = MAX_DIALINFO_STRING; // (was 1024)
static const UINT g_ucMaxAddrLen = MAX_DIALINFO_STRING; // (was 1024)
static const UINT g_ucMaxRemoteConfNameLen = MAX_DIALINFO_STRING; // (was 1024)
static const char g_cszConfLinkExt[] = ".cnf"; static const char g_cszConfLinkDefaultFileNamePrompt[] = "*.cnf"; static const char g_cszCRLF[] = "\r\n";
static const char g_cszEmpty[] = ""; #define EMPTY_STRING g_cszEmpty
#pragma data_seg()
/* Module Constants
*******************/
#pragma data_seg(DATA_SEG_READ_ONLY)
// case-insensitive
const char s_cszSectionBefore[] = "["; const char s_cszSectionAfter[] = "]"; const char s_cszKeyValueSep[] = "=";
const char s_cszConferenceShortcutSection[] = "ConferenceShortcut";
const char s_cszNameKey[] = "ConfName"; const char s_cszAddressKey[] = "Address"; const char s_cszTransportKey[] = "Transport"; const char s_cszRemoteConfNameKey[] = "RemoteConfName"; const char s_cszCallFlagsKey[] = "CallFlags";
const char s_cszIconFileKey[] = "IconFile"; const char s_cszIconIndexKey[] = "IconIndex"; const char s_cszHotkeyKey[] = "Hotkey"; const char s_cszWorkingDirectoryKey[] = "WorkingDirectory"; const char s_cszShowCmdKey[] = "ShowCommand";
const UINT s_ucMaxIconIndexLen = 1 + 10 + 1; // -2147483647
const UINT s_ucMaxTransportLen = 10 + 1; // 4294967296
const UINT s_ucMaxCallFlagsLen = 10 + 1; // 4294967296
const UINT s_ucMaxHotkeyLen = s_ucMaxIconIndexLen; const UINT s_ucMaxShowCmdLen = s_ucMaxIconIndexLen;
#pragma data_seg()
/***************************** Private Functions *****************************/
BOOL DeletePrivateProfileString(PCSTR pcszSection, PCSTR pcszKey, PCSTR pcszFile) { ASSERT(IS_VALID_STRING_PTR(pcszSection, CSTR)); ASSERT(IS_VALID_STRING_PTR(pcszKey, CSTR)); ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR));
return(WritePrivateProfileString(pcszSection, pcszKey, NULL, pcszFile)); }
HRESULT ReadConfNameFromFile(PCSTR pcszFile, PSTR *ppszName) { HRESULT hr; PSTR pszNewName;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(ppszName, PSTR));
*ppszName = NULL;
pszNewName = new(char[g_ucMaxNameLen]);
if (pszNewName) { DWORD dwcValueLen;
dwcValueLen = GetPrivateProfileString(s_cszConferenceShortcutSection, s_cszNameKey, EMPTY_STRING, pszNewName, g_ucMaxNameLen, pcszFile);
if (dwcValueLen > 0) { hr = S_OK; *ppszName = pszNewName; } else { hr = S_FALSE;
WARNING_OUT(("ReadConfNameFromFile: No Name found in file %s.", pcszFile)); } } else hr = E_OUTOFMEMORY;
if (FAILED(hr) || hr == S_FALSE) { if (pszNewName) { delete pszNewName; pszNewName = NULL; } }
ASSERT((hr == S_OK && IS_VALID_STRING_PTR(*ppszName, STR)) || (hr != S_OK && ! *ppszName));
return(hr); }
HRESULT WriteConfNameToFile(PCSTR pcszFile, PCSTR pcszName) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(! pcszName || IS_VALID_STRING_PTR(pcszName, CSTR));
if (AnyMeat(pcszName)) { ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_STRING_PTR(pcszName, PSTR));
// (- 1) for null terminator.
hr = (WritePrivateProfileString(s_cszConferenceShortcutSection, s_cszNameKey, pcszName, pcszFile)) ? S_OK : E_FAIL;
} else hr = (DeletePrivateProfileString(s_cszConferenceShortcutSection, s_cszNameKey, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
HRESULT ReadAddressFromFile(PCSTR pcszFile, PSTR *ppszAddress) { HRESULT hr; PSTR pszNewAddr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(ppszAddress, PSTR));
*ppszAddress = NULL;
pszNewAddr = new(char[g_ucMaxAddrLen]);
if (pszNewAddr) { DWORD dwcValueLen;
dwcValueLen = GetPrivateProfileString(s_cszConferenceShortcutSection, s_cszAddressKey, EMPTY_STRING, pszNewAddr, g_ucMaxAddrLen, pcszFile);
if (dwcValueLen > 0) { hr = S_OK; *ppszAddress = pszNewAddr; } else { hr = S_FALSE;
WARNING_OUT(("ReadAddressFromFile: No Address found in file %s.", pcszFile)); } } else hr = E_OUTOFMEMORY;
if (FAILED(hr) || hr == S_FALSE) { if (pszNewAddr) { delete pszNewAddr; pszNewAddr = NULL; } }
ASSERT((hr == S_OK && IS_VALID_STRING_PTR(*ppszAddress, STR)) || (hr != S_OK && ! *ppszAddress));
return(hr); }
HRESULT WriteAddressToFile(PCSTR pcszFile, PCSTR pcszAddress) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(! pcszAddress || IS_VALID_STRING_PTR(pcszAddress, CSTR));
if (AnyMeat(pcszAddress)) { ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_STRING_PTR(pcszAddress, PSTR));
// (- 1) for null terminator.
hr = (WritePrivateProfileString(s_cszConferenceShortcutSection, s_cszAddressKey, pcszAddress, pcszFile)) ? S_OK : E_FAIL;
} else hr = (DeletePrivateProfileString(s_cszConferenceShortcutSection, s_cszAddressKey, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
HRESULT ReadRemoteConfNameFromFile(PCSTR pcszFile, PSTR *ppszRemoteConfName) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(ppszRemoteConfName, PSTR));
*ppszRemoteConfName = NULL;
PSTR pszNewRemoteConfName = new(char[g_ucMaxAddrLen]);
if (pszNewRemoteConfName) { DWORD dwcValueLen;
dwcValueLen = GetPrivateProfileString(s_cszConferenceShortcutSection, s_cszRemoteConfNameKey, EMPTY_STRING, pszNewRemoteConfName, g_ucMaxRemoteConfNameLen, pcszFile);
if (dwcValueLen > 0) { hr = S_OK; *ppszRemoteConfName = pszNewRemoteConfName; } else { hr = S_FALSE;
TRACE_OUT(("ReadRemoteConfNameFromFile: No RemoteConfName found in file %s.", pcszFile)); } } else hr = E_OUTOFMEMORY;
if (FAILED(hr) || hr == S_FALSE) { delete pszNewRemoteConfName; pszNewRemoteConfName = NULL; }
ASSERT((hr == S_OK && IS_VALID_STRING_PTR(*ppszRemoteConfName, STR)) || (hr != S_OK && ! *ppszRemoteConfName));
return(hr); }
HRESULT WriteRemoteConfNameToFile(PCSTR pcszFile, PCSTR pcszRemoteConfName) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(! pcszRemoteConfName || IS_VALID_STRING_PTR(pcszRemoteConfName, CSTR));
if (AnyMeat(pcszRemoteConfName)) { ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_STRING_PTR(pcszRemoteConfName, PSTR));
// (- 1) for null terminator.
hr = (WritePrivateProfileString(s_cszConferenceShortcutSection, s_cszRemoteConfNameKey, pcszRemoteConfName, pcszFile)) ? S_OK : E_FAIL;
} else { hr = (DeletePrivateProfileString( s_cszConferenceShortcutSection, s_cszRemoteConfNameKey, pcszFile)) ? S_OK : E_FAIL; }
return(hr); }
HRESULT ReadTransportFromFile(PCSTR pcszFile, PDWORD pdwTransport) { HRESULT hr; char rgchNewTransport[s_ucMaxTransportLen]; DWORD dwcValueLen;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(pdwTransport, INT));
*pdwTransport = 0;
dwcValueLen = GetPrivateProfileString(s_cszConferenceShortcutSection, s_cszTransportKey, EMPTY_STRING, rgchNewTransport, sizeof(rgchNewTransport), pcszFile);
if (dwcValueLen > 0) { *pdwTransport = DecimalStringToUINT(rgchNewTransport); hr = S_OK; } else { hr = S_FALSE;
TRACE_OUT(("ReadTransportFromFile: No transport found in file %s.", pcszFile)); }
ASSERT((hr == S_OK) || (hr == S_FALSE && EVAL(*pdwTransport == 0)));
return(hr); }
HRESULT WriteTransportToFile(PCSTR pcszFile, DWORD dwTransport) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR));
char rgchTransportRHS[s_ucMaxTransportLen]; int ncLen;
ncLen = wsprintf(rgchTransportRHS, "%u", dwTransport); ASSERT(ncLen > 0); ASSERT(ncLen < sizeof(rgchTransportRHS)); ASSERT(ncLen == lstrlen(rgchTransportRHS));
hr = (WritePrivateProfileString(s_cszConferenceShortcutSection, s_cszTransportKey, rgchTransportRHS, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
HRESULT ReadCallFlagsFromFile(PCSTR pcszFile, PDWORD pdwCallFlags) { HRESULT hr; char rgchNewCallFlags[s_ucMaxCallFlagsLen]; DWORD dwcValueLen;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(pdwCallFlags, INT));
*pdwCallFlags = 0;
dwcValueLen = GetPrivateProfileString(s_cszConferenceShortcutSection, s_cszCallFlagsKey, EMPTY_STRING, rgchNewCallFlags, sizeof(rgchNewCallFlags), pcszFile);
if (dwcValueLen > 0) { *pdwCallFlags = DecimalStringToUINT(rgchNewCallFlags); hr = S_OK; } else { hr = S_FALSE;
TRACE_OUT(("ReadCallFlagsFromFile: No CallFlags found in file %s.", pcszFile)); }
ASSERT((hr == S_OK) || (hr == S_FALSE && EVAL(*pdwCallFlags == 0)));
return(hr); }
HRESULT WriteCallFlagsToFile(PCSTR pcszFile, DWORD dwCallFlags) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR));
char rgchCallFlagsRHS[s_ucMaxCallFlagsLen]; int ncLen;
ncLen = wsprintf(rgchCallFlagsRHS, "%u", dwCallFlags); ASSERT(ncLen > 0); ASSERT(ncLen < sizeof(rgchCallFlagsRHS)); ASSERT(ncLen == lstrlen(rgchCallFlagsRHS));
hr = (WritePrivateProfileString(s_cszConferenceShortcutSection, s_cszCallFlagsKey, rgchCallFlagsRHS, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
#if 0
HRESULT ReadIconLocationFromFile(PCSTR pcszFile, PSTR *ppszIconFile, PINT pniIcon) { HRESULT hr; char rgchNewIconFile[MAX_PATH_LEN]; DWORD dwcValueLen;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(ppszIconFile, PSTR)); ASSERT(IS_VALID_WRITE_PTR(pniIcon, INT));
*ppszIconFile = NULL; *pniIcon = 0;
dwcValueLen = GetPrivateProfileString(s_cszInternetShortcutSection, s_cszIconFileKey, EMPTY_STRING, rgchNewIconFile, sizeof(rgchNewIconFile), pcszFile);
if (dwcValueLen > 0) { char rgchNewIconIndex[s_ucMaxIconIndexLen];
dwcValueLen = GetPrivateProfileString(s_cszInternetShortcutSection, s_cszIconIndexKey, EMPTY_STRING, rgchNewIconIndex, sizeof(rgchNewIconIndex), pcszFile);
if (dwcValueLen > 0) { int niIcon = DecimalStringToUINT(rgchNewIconIndex);
*ppszIconFile = new(char[lstrlen(rgchNewIconFile) + 1]);
if (*ppszIconFile) { lstrcpy(*ppszIconFile, rgchNewIconFile); *pniIcon = niIcon;
hr = S_OK; } else hr = E_OUTOFMEMORY; } else { hr = S_FALSE;
WARNING_OUT(("ReadIconLocationFromFile(): No icon index found in file %s.", pcszFile)); } } else { hr = S_FALSE;
TRACE_OUT(("ReadIconLocationFromFile(): No icon file found in file %s.", pcszFile)); }
ASSERT(IsValidIconIndex(hr, *ppszIconFile, MAX_PATH_LEN, *pniIcon));
return(hr); }
HRESULT WriteIconLocationToFile(PCSTR pcszFile, PCSTR pcszIconFile, int niIcon) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(! pcszIconFile || IS_VALID_STRING_PTR(pcszIconFile, CSTR)); ASSERT(IsValidIconIndex((pcszIconFile ? S_OK : S_FALSE), pcszIconFile, MAX_PATH_LEN, niIcon));
if (AnyMeat(pcszIconFile)) { char rgchIconIndexRHS[s_ucMaxIconIndexLen]; int ncLen;
ncLen = wsprintf(rgchIconIndexRHS, "%d", niIcon); ASSERT(ncLen > 0); ASSERT(ncLen < sizeof(rgchIconIndexRHS)); ASSERT(ncLen == lstrlen(rgchIconIndexRHS));
hr = (WritePrivateProfileString(s_cszInternetShortcutSection, s_cszIconFileKey, pcszIconFile, pcszFile) && WritePrivateProfileString(s_cszInternetShortcutSection, s_cszIconIndexKey, rgchIconIndexRHS, pcszFile)) ? S_OK : E_FAIL; } else hr = (DeletePrivateProfileString(s_cszInternetShortcutSection, s_cszIconFileKey, pcszFile) && DeletePrivateProfileString(s_cszInternetShortcutSection, s_cszIconIndexKey, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
HRESULT ReadHotkeyFromFile(PCSTR pcszFile, PWORD pwHotkey) { HRESULT hr = S_FALSE; char rgchHotkey[s_ucMaxHotkeyLen]; DWORD dwcValueLen;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(pwHotkey, WORD));
*pwHotkey = 0;
dwcValueLen = GetPrivateProfileString(s_cszInternetShortcutSection, s_cszHotkeyKey, EMPTY_STRING, rgchHotkey, sizeof(rgchHotkey), pcszFile);
if (dwcValueLen > 0) { *pwHotkey = (WORD) DecimalStringToUINT(rgchHotkey); hr = S_OK; } else WARNING_OUT(("ReadHotkeyFromFile(): No hotkey found in file %s.", pcszFile));
ASSERT((hr == S_OK && IsValidHotkey(*pwHotkey)) || (hr == S_FALSE && ! *pwHotkey));
return(hr); }
HRESULT WriteHotkeyToFile(PCSTR pcszFile, WORD wHotkey) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(! wHotkey || IsValidHotkey(wHotkey));
if (wHotkey) { char rgchHotkeyRHS[s_ucMaxHotkeyLen]; int ncLen;
ncLen = wsprintf(rgchHotkeyRHS, "%u", (UINT)wHotkey); ASSERT(ncLen > 0); ASSERT(ncLen < sizeof(rgchHotkeyRHS)); ASSERT(ncLen == lstrlen(rgchHotkeyRHS));
hr = WritePrivateProfileString(s_cszInternetShortcutSection, s_cszHotkeyKey, rgchHotkeyRHS, pcszFile) ? S_OK : E_FAIL; } else hr = DeletePrivateProfileString(s_cszInternetShortcutSection, s_cszHotkeyKey, pcszFile) ? S_OK : E_FAIL;
return(hr); }
HRESULT ReadWorkingDirectoryFromFile(PCSTR pcszFile, PSTR *ppszWorkingDirectory) { HRESULT hr; char rgchDirValue[MAX_PATH_LEN]; DWORD dwcValueLen;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(ppszWorkingDirectory, PSTR));
*ppszWorkingDirectory = NULL;
dwcValueLen = GetPrivateProfileString(s_cszInternetShortcutSection, s_cszWorkingDirectoryKey, EMPTY_STRING, rgchDirValue, sizeof(rgchDirValue), pcszFile);
if (dwcValueLen > 0) { char rgchFullPath[MAX_PATH_LEN]; PSTR pszFileName;
if (GetFullPathName(rgchDirValue, sizeof(rgchFullPath), rgchFullPath, &pszFileName) > 0) { // (+ 1) for null terminator.
*ppszWorkingDirectory = new(char[lstrlen(rgchFullPath) + 1]);
if (*ppszWorkingDirectory) { lstrcpy(*ppszWorkingDirectory, rgchFullPath);
hr = S_OK; } else hr = E_OUTOFMEMORY; } else hr = E_FAIL; } else { hr = S_FALSE;
TRACE_OUT(("ReadWorkingDirectoryFromFile: No working directory found in file %s.", pcszFile)); }
ASSERT(IsValidPathResult(hr, *ppszWorkingDirectory, MAX_PATH_LEN));
return(hr); }
HRESULT WriteWorkingDirectoryToFile(PCSTR pcszFile, PCSTR pcszWorkingDirectory) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(! pcszWorkingDirectory || IS_VALID_STRING_PTR(pcszWorkingDirectory, CSTR));
if (AnyMeat(pcszWorkingDirectory)) hr = (WritePrivateProfileString(s_cszInternetShortcutSection, s_cszWorkingDirectoryKey, pcszWorkingDirectory, pcszFile)) ? S_OK : E_FAIL; else hr = (DeletePrivateProfileString(s_cszInternetShortcutSection, s_cszWorkingDirectoryKey, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
HRESULT ReadShowCmdFromFile(PCSTR pcszFile, PINT pnShowCmd) { HRESULT hr; char rgchNewShowCmd[s_ucMaxShowCmdLen]; DWORD dwcValueLen;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IS_VALID_WRITE_PTR(pnShowCmd, INT));
*pnShowCmd = g_nDefaultShowCmd;
dwcValueLen = GetPrivateProfileString(s_cszInternetShortcutSection, s_cszShowCmdKey, EMPTY_STRING, rgchNewShowCmd, sizeof(rgchNewShowCmd), pcszFile);
if (dwcValueLen > 0) { *pnShowCmd = DecimalStringToUINT(rgchNewShowCmd); hr = S_OK; } else { hr = S_FALSE;
TRACE_OUT(("ReadShowCmdFromFile: No show command found in file %s.", pcszFile)); }
ASSERT((hr == S_OK && EVAL(IsValidShowCmd(*pnShowCmd))) || (hr == S_FALSE && EVAL(*pnShowCmd == g_nDefaultShowCmd)));
return(hr); }
HRESULT WriteShowCmdToFile(PCSTR pcszFile, int nShowCmd) { HRESULT hr;
ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR)); ASSERT(IsValidShowCmd(nShowCmd));
if (nShowCmd != g_nDefaultShowCmd) { char rgchShowCmdRHS[s_ucMaxShowCmdLen]; int ncLen;
ncLen = wsprintf(rgchShowCmdRHS, "%d", nShowCmd); ASSERT(ncLen > 0); ASSERT(ncLen < sizeof(rgchShowCmdRHS)); ASSERT(ncLen == lstrlen(rgchShowCmdRHS));
hr = (WritePrivateProfileString(s_cszInternetShortcutSection, s_cszShowCmdKey, rgchShowCmdRHS, pcszFile)) ? S_OK : E_FAIL; } else hr = (DeletePrivateProfileString(s_cszInternetShortcutSection, s_cszShowCmdKey, pcszFile)) ? S_OK : E_FAIL;
return(hr); }
#endif // 0
/****************************** Public Functions *****************************/
// BUGBUG - Isn't this already in NMUTIL?
HRESULT UnicodeToANSI(LPCOLESTR pcwszUnicode, PSTR *ppszANSI) { HRESULT hr; int ncbLen;
// BUGBUG: Need OLESTR validation function to validate pcwszUnicode here.
ASSERT(IS_VALID_WRITE_PTR(ppszANSI, PSTR));
*ppszANSI = NULL;
// Get length of translated string.
ncbLen = WideCharToMultiByte(CP_ACP, 0, pcwszUnicode, -1, NULL, 0, NULL, NULL);
if (ncbLen > 0) { PSTR pszNewANSI;
// (+ 1) for null terminator.
pszNewANSI = new(char[ncbLen]);
if (pszNewANSI) { // Translate string.
if (WideCharToMultiByte(CP_ACP, 0, pcwszUnicode, -1, pszNewANSI, ncbLen, NULL, NULL) > 0) { *ppszANSI = pszNewANSI; hr = S_OK; } else { delete pszNewANSI; pszNewANSI = NULL;
hr = E_UNEXPECTED;
WARNING_OUT(("UnicodeToANSI(): Failed to translate Unicode string to ANSI.")); } } else hr = E_OUTOFMEMORY; } else { hr = E_UNEXPECTED;
WARNING_OUT(("UnicodeToANSI(): Failed to get length of translated ANSI string.")); }
ASSERT(FAILED(hr) || IS_VALID_STRING_PTR(*ppszANSI, STR));
return(hr); }
HRESULT ANSIToUnicode(PCSTR pcszANSI, LPOLESTR *ppwszUnicode) { HRESULT hr; int ncbWideLen;
ASSERT(IS_VALID_STRING_PTR(pcszANSI, CSTR)); ASSERT(IS_VALID_WRITE_PTR(ppwszUnicode, LPOLESTR));
*ppwszUnicode = NULL;
// Get length of translated string.
ncbWideLen = MultiByteToWideChar(CP_ACP, 0, pcszANSI, -1, NULL, 0);
if (ncbWideLen > 0) { PWSTR pwszNewUnicode;
// (+ 1) for null terminator.
pwszNewUnicode = new(WCHAR[ncbWideLen]);
if (pwszNewUnicode) { // Translate string.
if (MultiByteToWideChar(CP_ACP, 0, pcszANSI, -1, pwszNewUnicode, ncbWideLen) > 0) { *ppwszUnicode = pwszNewUnicode; hr = S_OK; } else { delete pwszNewUnicode; pwszNewUnicode = NULL;
hr = E_UNEXPECTED;
WARNING_OUT(("ANSIToUnicode(): Failed to translate ANSI path string to Unicode.")); } } else hr = E_OUTOFMEMORY; } else { hr = E_UNEXPECTED;
WARNING_OUT(("ANSIToUnicode(): Failed to get length of translated Unicode string.")); }
// BUGBUG: Need OLESTR validation function to validate *ppwszUnicode here.
return(hr); }
/********************************** Methods **********************************/
HRESULT STDMETHODCALLTYPE CConfLink::SaveToFile(PCSTR pcszFile, BOOL bRemember) { HRESULT hr;
DebugEntry(CConfLink::SaveToFile);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR));
#if 0
PSTR pszName; hr = GetName(&pszName);
if (SUCCEEDED(hr)) { hr = WriteConfNameToFile(pcszFile, pszName);
// Free the string:
if (pszName) { LPMALLOC pMalloc = NULL;
if (SUCCEEDED(SHGetMalloc(&pMalloc))) { pMalloc->Free(pszName); pMalloc->Release(); pMalloc = NULL; pszName = NULL; } } } #endif // 0
hr = S_OK; if (NULL != m_pszName) { hr = WriteConfNameToFile(pcszFile, m_pszName); } if ((S_OK == hr) && (NULL != m_pszAddress)) { hr = WriteAddressToFile(pcszFile, m_pszAddress); }
if ((S_OK == hr) && (NULL != m_pszRemoteConfName)) { hr = WriteRemoteConfNameToFile(pcszFile, m_pszRemoteConfName); }
if (S_OK == hr) { hr = WriteCallFlagsToFile(pcszFile, m_dwCallFlags); }
if (S_OK == hr) { hr = WriteTransportToFile(pcszFile, m_dwTransport); }
#if 0
if (hr == S_OK) { char rgchBuf[MAX_PATH_LEN]; int niIcon;
hr = GetIconLocation(rgchBuf, sizeof(rgchBuf), &niIcon);
if (SUCCEEDED(hr)) { hr = WriteIconLocationToFile(pcszFile, rgchBuf, niIcon);
if (hr == S_OK) { WORD wHotkey;
hr = GetHotkey(&wHotkey);
if (SUCCEEDED(hr)) { hr = WriteHotkeyToFile(pcszFile, wHotkey);
if (hr == S_OK) { hr = GetWorkingDirectory(rgchBuf, sizeof(rgchBuf));
if (SUCCEEDED(hr)) { hr = WriteWorkingDirectoryToFile(pcszFile, rgchBuf);
if (hr == S_OK) { int nShowCmd;
GetShowCmd(&nShowCmd);
hr = WriteShowCmdToFile(pcszFile, nShowCmd);
if (hr == S_OK) { /* Remember file if requested. */
#endif
if (bRemember) { // Replace existing file string, if any
if (m_pszFile) { delete m_pszFile; }
m_pszFile = new TCHAR[lstrlen(pcszFile)+1]; if (NULL != m_pszFile) { lstrcpy(m_pszFile, pcszFile);
TRACE_OUT(("CConfLink::SaveToFile(): Remembering file %s, as requested.", m_pszFile)); } else { hr = E_OUTOFMEMORY; } }
if (hr == S_OK) { Dirty(FALSE);
SHChangeNotify(SHCNE_UPDATEITEM, (SHCNF_PATH | SHCNF_FLUSH), pcszFile, NULL);
#ifdef DEBUG
TRACE_OUT(("CConfLink::SaveToFile(): Conf Link saved to file %s:", pcszFile)); Dump(); #endif // DEBUG
} #if 0
} } } } } } } }
} #endif // 0
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::SaveToFile, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::LoadFromFile( PCSTR pcszFile, BOOL bRemember) { HRESULT hr; PSTR pszName; PSTR pszAddr; PSTR pszRemoteConfName; DWORD dwTransport; DWORD dwCallFlags;
DebugEntry(CConfLink::LoadFromFile);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRING_PTR(pcszFile, CSTR));
hr = ReadConfNameFromFile(pcszFile, &pszName);
if (S_OK == hr) { hr = SetName(pszName);
if (pszName) { delete pszName; pszName = NULL; } } if (SUCCEEDED(hr)) { hr = ReadAddressFromFile(pcszFile, &pszAddr);
if (S_OK == hr) { hr = SetAddress(pszAddr);
if (NULL != pszAddr) { delete pszAddr; pszAddr = NULL; } } }
if (SUCCEEDED(hr)) { hr = ReadTransportFromFile(pcszFile, &dwTransport);
if (S_OK == hr) { hr = SetTransport(dwTransport); } }
if (SUCCEEDED(hr)) { hr = ReadCallFlagsFromFile(pcszFile, &dwCallFlags);
if (S_OK == hr) { hr = SetCallFlags(dwCallFlags); } } if (SUCCEEDED(hr)) { hr = ReadRemoteConfNameFromFile(pcszFile, &pszRemoteConfName);
if (S_OK == hr) { hr = SetRemoteConfName(pszRemoteConfName);
delete pszRemoteConfName; pszRemoteConfName = NULL; } } #if 0
if (hr == S_OK) { PSTR pszIconFile; int niIcon;
hr = ReadIconLocationFromFile(pcszFile, &pszIconFile, &niIcon);
if (SUCCEEDED(hr)) { hr = SetIconLocation(pszIconFile, niIcon);
if (pszIconFile) { delete pszIconFile; pszIconFile = NULL; }
if (hr == S_OK) { WORD wHotkey;
hr = ReadHotkeyFromFile(pcszFile, &wHotkey);
if (SUCCEEDED(hr)) { hr = SetHotkey(wHotkey);
if (hr == S_OK) { PSTR pszWorkingDirectory;
hr = ReadWorkingDirectoryFromFile(pcszFile, &pszWorkingDirectory);
if (SUCCEEDED(hr)) { hr = SetWorkingDirectory(pszWorkingDirectory);
if (pszWorkingDirectory) { delete pszWorkingDirectory; pszWorkingDirectory = NULL; }
if (hr == S_OK) { int nShowCmd;
hr = ReadShowCmdFromFile(pcszFile, &nShowCmd);
#endif // 0
if (SUCCEEDED(hr)) { /* Remember file if requested. */
if (bRemember) { // PSTR pszFileCopy;
//
if (NULL != m_pszFile) { delete m_pszFile; }
m_pszFile = new TCHAR[lstrlen(pcszFile) + 1]; if (NULL != m_pszFile) { lstrcpy(m_pszFile, pcszFile); } else { hr = E_OUTOFMEMORY; }
// if (StringCopy(pcszFile, &pszFileCopy))
// {
// if (m_pszFile)
// delete m_pszFile;
// m_pszFile = pszFileCopy;
// TRACE_OUT(("CConfLink::LoadFromFile(): Remembering file %s, as requested.",
// m_pszFile));
// }
// else
// hr = E_OUTOFMEMORY;
}
if (SUCCEEDED(hr)) { // SetShowCmd(nShowCmd);
Dirty(FALSE);
hr = S_OK;
#ifdef DEBUG
TRACE_OUT(("CConfLink::LoadFromFile(): Conf Link loaded from file %s:", pcszFile)); Dump(); #endif
} } #if 0
} } } } } } } } #endif // 0
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::LoadFromFile, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::GetCurFile(PSTR pszFile, UINT ucbLen) { HRESULT hr;
DebugEntry(CConfLink::GetCurFile);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_WRITE_BUFFER_PTR(pszFile, STR, ucbLen));
if (m_pszFile) { lstrcpyn(pszFile, m_pszFile, ucbLen);
TRACE_OUT(("CConfLink::GetCurFile(): Current file name is %s.", pszFile));
hr = S_OK; } else hr = S_FALSE;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRING_PTR(pszFile, STR) && EVAL((UINT)lstrlen(pszFile) < ucbLen)); ASSERT(hr == S_OK || hr == S_FALSE);
DebugExitHRESULT(CConfLink::GetCurFile, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::Dirty(BOOL bDirty) { HRESULT hr;
DebugEntry(CConfLink::Dirty);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
if (bDirty) { if (IS_FLAG_CLEAR(m_dwFlags, CONFLNK_FL_DIRTY)) { TRACE_OUT(("CConfLink::Dirty(): Now dirty.")); }
SET_FLAG(m_dwFlags, CONFLNK_FL_DIRTY); } else { if (IS_FLAG_SET(m_dwFlags, CONFLNK_FL_DIRTY)) { TRACE_OUT(("CConfLink::Dirty(): Now clean.")); }
CLEAR_FLAG(m_dwFlags, CONFLNK_FL_DIRTY); }
hr = S_OK;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(hr == S_OK);
DebugExitVOID(CConfLink::Dirty);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::GetClassID(PCLSID pclsid) { HRESULT hr;
DebugEntry(CConfLink::GetClassID);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRUCT_PTR(pclsid, CCLSID));
*pclsid = CLSID_ConfLink; hr = S_OK;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(FAILED(hr) || IS_VALID_STRUCT_PTR(pclsid, CCLSID));
DebugExitHRESULT(CConfLink::GetClassID, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::IsDirty(void) { HRESULT hr;
DebugEntry(CConfLink::IsDirty);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
if (IS_FLAG_SET(m_dwFlags, CONFLNK_FL_DIRTY)) hr = S_OK; else hr = S_FALSE;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::IsDirty, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::Save( LPCOLESTR pcwszFile, BOOL bRemember) { HRESULT hr; PSTR pszFile;
DebugEntry(CConfLink::Save);
// bRemember may be any value.
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); // BUGBUG: Need OLESTR validation function to validate pcwszFile here.
if (pcwszFile) { hr = UnicodeToANSI(pcwszFile, &pszFile);
if (hr == S_OK) { hr = SaveToFile(pszFile, bRemember);
delete pszFile; pszFile = NULL; } } else if (m_pszFile) // Ignore bRemember.
hr = SaveToFile(m_pszFile, FALSE); else hr = E_FAIL;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::Save, hr);
return(hr); }
// #pragma warning(disable:4100) /* "unreferenced formal parameter" warning */
HRESULT STDMETHODCALLTYPE CConfLink::SaveCompleted(LPCOLESTR pcwszFile) { HRESULT hr;
DebugEntry(CConfLink::SaveCompleted);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
// BUGBUG: Need OLESTR validation function to validate pcwszFile here.
hr = S_OK;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::SaveCompleted, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::Load( LPCOLESTR pcwszFile, DWORD dwMode) { HRESULT hr; PSTR pszFile;
DebugEntry(CConfLink::Load);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
// BUGBUG: Need OLESTR validation function to validate pcwszFile here.
// BUGBUG: Validate dwMode here.
// BUGBUG: Implement dwMode flag support.
hr = UnicodeToANSI(pcwszFile, &pszFile);
if (hr == S_OK) { hr = LoadFromFile(pszFile, TRUE);
delete pszFile; pszFile = NULL; }
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::Load, hr);
return(hr); }
// #pragma warning(default:4100) /* "unreferenced formal parameter" warning */
HRESULT STDMETHODCALLTYPE CConfLink::GetCurFile(LPOLESTR *ppwszFile) { HRESULT hr; LPOLESTR pwszTempFile;
DebugEntry(CConfLink::GetCurFile);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_WRITE_PTR(ppwszFile, LPOLESTR));
if (m_pszFile) { hr = ANSIToUnicode(m_pszFile, &pwszTempFile);
if (hr == S_OK) { TRACE_OUT(("CConfLink::GetCurFile(): Current file name is %s.", m_pszFile)); } } else { hr = ANSIToUnicode(g_cszConfLinkDefaultFileNamePrompt, &pwszTempFile);
if (hr == S_OK) { hr = S_FALSE;
TRACE_OUT(("CConfLink::GetCurFile(): No current file name. Returning default file name prompt %s.", g_cszConfLinkDefaultFileNamePrompt)); } }
if (SUCCEEDED(hr)) { // We should really call OleGetMalloc() to get the process IMalloc here.
// Use SHAlloc() here instead to avoid loading ole32.dll.
// SHAlloc() / SHFree() turn in to IMalloc::Alloc() and IMalloc::Free()
// once ole32.dll is loaded.
// N.b., lstrlenW() returns the length of the given string in characters,
// not bytes.
// (+ 1) for null terminator.
LPMALLOC pMalloc = NULL; *ppwszFile = NULL;
if (SUCCEEDED(SHGetMalloc(&pMalloc))) { *ppwszFile = (LPOLESTR) pMalloc->Alloc((lstrlenW(pwszTempFile) + 1) * sizeof(*pwszTempFile)); pMalloc->Release(); pMalloc = NULL; }
if (*ppwszFile) { LStrCpyW(*ppwszFile, pwszTempFile); } else hr = E_OUTOFMEMORY;
delete pwszTempFile; pwszTempFile = NULL; }
// BUGBUG: Need OLESTR validation function to validate *ppwszFile here.
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::GetCurFile, hr);
return(hr); }
// #pragma warning(disable:4100) /* "unreferenced formal parameter" warning */
HRESULT STDMETHODCALLTYPE CConfLink::Load(PIStream pistr) { HRESULT hr;
DebugEntry(CConfLink::Load);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_INTERFACE_PTR(pistr, IStream));
hr = E_NOTIMPL;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::Load, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::Save( PIStream pistr, BOOL bClearDirty) { HRESULT hr;
DebugEntry(CConfLink::Save);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_INTERFACE_PTR(pistr, IStream));
hr = E_NOTIMPL;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::Save, hr);
return(hr); }
HRESULT STDMETHODCALLTYPE CConfLink::GetSizeMax(PULARGE_INTEGER pcbSize) { HRESULT hr;
DebugEntry(CConfLink::GetSizeMax);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_WRITE_PTR(pcbSize, ULARGE_INTEGER));
hr = E_NOTIMPL;
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitHRESULT(CConfLink::GetSizeMax, hr);
return(hr); }
// #pragma warning(default:4100) /* "unreferenced formal parameter" warning */
DWORD STDMETHODCALLTYPE CConfLink::GetFileContentsSize(void) { DWORD dwcbLen;
DebugEntry(CConfLink::GetFileContentsSize);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
// Section length.
// (- 1) for each null terminator.
dwcbLen = sizeof(s_cszSectionBefore) - 1 + sizeof(s_cszConferenceShortcutSection) - 1 + sizeof(s_cszSectionAfter) - 1; if (m_pszName) { // Name length.
dwcbLen += sizeof(g_cszCRLF) - 1 + sizeof(s_cszNameKey) - 1 + sizeof(s_cszKeyValueSep) - 1 + lstrlen(m_pszName); }
if (m_pszAddress) { // Address length.
dwcbLen += sizeof(g_cszCRLF) - 1 + sizeof(s_cszAddressKey) - 1 + sizeof(s_cszKeyValueSep) - 1 + lstrlen(m_pszAddress); }
if (m_pszRemoteConfName) { // RemoteConfName length.
dwcbLen += sizeof(g_cszCRLF) - 1 + sizeof(s_cszRemoteConfNameKey) - 1 + sizeof(s_cszKeyValueSep) - 1 + lstrlen(m_pszRemoteConfName); }
// CallFlags length
dwcbLen += sizeof(g_cszCRLF) - 1 + sizeof(s_cszCallFlagsKey) - 1 + sizeof(s_cszKeyValueSep) - 1 + s_ucMaxCallFlagsLen;
// Transport length
dwcbLen += sizeof(g_cszCRLF) - 1 + sizeof(s_cszTransportKey) - 1 + sizeof(s_cszKeyValueSep) - 1 + s_ucMaxTransportLen; ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
DebugExitDWORD(CConfLink::GetFileContentsSize, dwcbLen);
return(dwcbLen); }
#ifdef DEBUG
void STDMETHODCALLTYPE CConfLink::Dump(void) { ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink));
TRACE_OUT(("m_dwFlags = %#08lx", m_dwFlags)); TRACE_OUT(("m_pszFile = \"%s\"", CHECK_STRING(m_pszFile))); TRACE_OUT(("m_pszName = \"%s\"", CHECK_STRING(m_pszName))); #if 0
TRACE_OUT(("m_pszIconFile = \"%s\"", CHECK_STRING(m_pszIconFile))); TRACE_OUT(("m_niIcon = %d", m_niIcon)); TRACE_OUT(("m_wHotkey = %#04x", (UINT)m_wHotkey)); TRACE_OUT(("m_pszWorkingDirectory = \"%s\"", CHECK_STRING(m_pszWorkingDirectory))); TRACE_OUT(("m_nShowCmd = %d", m_nShowCmd)); #endif // 0
return; }
#endif
#if 0
HRESULT STDMETHODCALLTYPE CConfLink::TransferConfLink( PFORMATETC pfmtetc, PSTGMEDIUM pstgmed) { HRESULT hr;
DebugEntry(CConfLink::TransferConfLink);
ASSERT(0 && "If we hit this assert, we need to implement this function");
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRUCT_PTR(pfmtetc, CFORMATETC)); ASSERT(IS_VALID_WRITE_PTR(pstgmed, STGMEDIUM));
ASSERT(pfmtetc->dwAspect == DVASPECT_CONTENT); ASSERT(pfmtetc->lindex == -1);
ZeroMemory(pstgmed, sizeof(*pstgmed));
if (IS_FLAG_SET(pfmtetc->tymed, TYMED_HGLOBAL)) { // BUGBUG: ChrisPi 9-15-95
// This only transfers the conference name
// (It does not transfer the address)
if (m_pszName) { HGLOBAL hgName;
hr = E_OUTOFMEMORY;
// (+ 1) for null terminator.
hgName = GlobalAlloc(0, lstrlen(m_pszName) + 1);
if (hgName) { PSTR pszName;
pszName = (PSTR)GlobalLock(hgName);
if (EVAL(pszName)) { lstrcpy(pszName, m_pszName);
pstgmed->tymed = TYMED_HGLOBAL; pstgmed->hGlobal = hgName; ASSERT(! pstgmed->pUnkForRelease);
hr = S_OK;
GlobalUnlock(hgName); pszName = NULL; }
if (hr != S_OK) { GlobalFree(hgName); hgName = NULL; } } } else { hr = DV_E_FORMATETC; } } else { hr = DV_E_TYMED; }
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT((hr == S_OK && IS_VALID_STRUCT_PTR(pstgmed, CSTGMEDIUM)) || (FAILED(hr) && (EVAL(pstgmed->tymed == TYMED_NULL) && EVAL(! pstgmed->hGlobal) && EVAL(! pstgmed->pUnkForRelease))));
DebugExitHRESULT(CConfLink::TransferConfLink, hr);
return(hr); } #endif // 0
#if 0
HRESULT STDMETHODCALLTYPE CConfLink::TransferText( PFORMATETC pfmtetc, PSTGMEDIUM pstgmed) { HRESULT hr;
DebugEntry(CConfLink::TransferText);
// Assume CConfLink::TransferConfLink() will perform
// input and output validation.
hr = TransferConfLink(pfmtetc, pstgmed);
DebugExitHRESULT(CConfLink::TransferText, hr);
return(hr); } #endif // 0
#if 0
HRESULT STDMETHODCALLTYPE CConfLink::TransferFileGroupDescriptor( PFORMATETC pfmtetc, PSTGMEDIUM pstgmed) { HRESULT hr;
DebugEntry(CConfLink::TransferFileGroupDescriptor);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRUCT_PTR(pfmtetc, CFORMATETC)); ASSERT(IS_VALID_WRITE_PTR(pstgmed, STGMEDIUM));
ASSERT(pfmtetc->dwAspect == DVASPECT_CONTENT); ASSERT(pfmtetc->lindex == -1);
pstgmed->tymed = TYMED_NULL; pstgmed->hGlobal = NULL; pstgmed->pUnkForRelease = NULL;
if (IS_FLAG_SET(pfmtetc->tymed, TYMED_HGLOBAL)) { HGLOBAL hgFileGroupDesc;
hr = E_OUTOFMEMORY;
hgFileGroupDesc = GlobalAlloc(GMEM_ZEROINIT, sizeof(FILEGROUPDESCRIPTOR));
if (hgFileGroupDesc) { PFILEGROUPDESCRIPTOR pfgd;
pfgd = (PFILEGROUPDESCRIPTOR)GlobalLock(hgFileGroupDesc);
if (EVAL(pfgd)) { PFILEDESCRIPTOR pfd = &(pfgd->fgd[0]);
// Do we already have a file name to use?
if (m_pszName) { TCHAR szFileName[MAX_PATH]; // copy shortcut
// BUGBUG: needs to be a resource INTL
lstrcpy(szFileName, _TEXT("Shortcut to ")); // copy Conference Name
lstrcat(szFileName, m_pszName); // copy extension
lstrcat(szFileName, g_cszConfLinkExt); MyLStrCpyN(pfd->cFileName, szFileName, sizeof(pfd->cFileName)); hr = S_OK; } else { // BUGBUG: need resource here! INTL
//if (EVAL(LoadString(GetThisModulesHandle(),
// IDS_NEW_INTERNET_SHORTCUT, pfd->cFileName,
// sizeof(pfd->cFileName))))
MyLStrCpyN(pfd->cFileName, "New Conference Shortcut.cnf", sizeof(pfd->cFileName)); hr = S_OK; }
if (hr == S_OK) { pfd->dwFlags = (FD_FILESIZE | FD_LINKUI); pfd->nFileSizeHigh = 0; pfd->nFileSizeLow = GetFileContentsSize();
pfgd->cItems = 1;
pstgmed->tymed = TYMED_HGLOBAL; pstgmed->hGlobal = hgFileGroupDesc; ASSERT(! pstgmed->pUnkForRelease); }
GlobalUnlock(hgFileGroupDesc); pfgd = NULL; }
if (hr != S_OK) { GlobalFree(hgFileGroupDesc); hgFileGroupDesc = NULL; } } } else { hr = DV_E_TYMED; }
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT((hr == S_OK && IS_VALID_STRUCT_PTR(pstgmed, CSTGMEDIUM)) || (FAILED(hr) && (EVAL(pstgmed->tymed == TYMED_NULL) && EVAL(! pstgmed->hGlobal) && EVAL(! pstgmed->pUnkForRelease))));
DebugExitHRESULT(CConfLink::TransferFileGroupDescriptor, hr);
return(hr); } #endif // 0
HRESULT STDMETHODCALLTYPE CConfLink::TransferFileContents( PFORMATETC pfmtetc, PSTGMEDIUM pstgmed) { HRESULT hr;
DebugEntry(CConfLink::TransferFileContents);
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT(IS_VALID_STRUCT_PTR(pfmtetc, CFORMATETC)); ASSERT(IS_VALID_WRITE_PTR(pstgmed, STGMEDIUM));
ASSERT(pfmtetc->dwAspect == DVASPECT_CONTENT); ASSERT(! pfmtetc->lindex);
pstgmed->tymed = TYMED_NULL; pstgmed->hGlobal = NULL; pstgmed->pUnkForRelease = NULL;
if (IS_FLAG_SET(pfmtetc->tymed, TYMED_HGLOBAL)) { DWORD dwcbLen; HGLOBAL hgFileContents;
hr = E_OUTOFMEMORY;
dwcbLen = GetFileContentsSize();
hgFileContents = GlobalAlloc(0, dwcbLen);
if (hgFileContents) { PSTR pszFileContents;
pszFileContents = (PSTR)GlobalLock(hgFileContents);
if (EVAL(pszFileContents)) { PSTR psz = pszFileContents;
// Copy section.
CopyMemory(psz, s_cszSectionBefore, sizeof(s_cszSectionBefore) - 1); psz += sizeof(s_cszSectionBefore) - 1;
CopyMemory(psz, s_cszConferenceShortcutSection, sizeof(s_cszConferenceShortcutSection) - 1); psz += sizeof(s_cszConferenceShortcutSection) - 1;
CopyMemory(psz, s_cszSectionAfter, sizeof(s_cszSectionAfter) - 1); psz += sizeof(s_cszSectionAfter) - 1;
if (m_pszName) { // Copy Name.
CopyMemory(psz, g_cszCRLF, sizeof(g_cszCRLF) - 1); psz += sizeof(g_cszCRLF) - 1;
CopyMemory(psz, s_cszNameKey, sizeof(s_cszNameKey) - 1); psz += sizeof(s_cszNameKey) - 1;
CopyMemory(psz, s_cszKeyValueSep, sizeof(s_cszKeyValueSep) - 1); psz += sizeof(s_cszKeyValueSep) - 1;
CopyMemory(psz, m_pszName, lstrlen(m_pszName)); psz += lstrlen(m_pszName); }
if (m_pszAddress) { // Copy Name.
CopyMemory(psz, g_cszCRLF, sizeof(g_cszCRLF) - 1); psz += sizeof(g_cszCRLF) - 1;
CopyMemory(psz, s_cszAddressKey, sizeof(s_cszAddressKey) - 1); psz += sizeof(s_cszAddressKey) - 1;
CopyMemory(psz, s_cszKeyValueSep, sizeof(s_cszKeyValueSep) - 1); psz += sizeof(s_cszKeyValueSep) - 1;
CopyMemory(psz, m_pszAddress, lstrlen(m_pszAddress)); psz += lstrlen(m_pszAddress); }
// Copy Transport.
CopyMemory(psz, g_cszCRLF, sizeof(g_cszCRLF) - 1); psz += sizeof(g_cszCRLF) - 1;
CopyMemory(psz, s_cszTransportKey, sizeof(s_cszTransportKey) - 1); psz += sizeof(s_cszTransportKey) - 1;
CopyMemory(psz, s_cszKeyValueSep, sizeof(s_cszKeyValueSep) - 1); psz += sizeof(s_cszKeyValueSep) - 1;
TCHAR szBuf[s_ucMaxTransportLen]; wsprintf(szBuf, "%10u", m_dwTransport); CopyMemory(psz, szBuf, lstrlen(szBuf)); psz += lstrlen(szBuf);
ASSERT(psz == pszFileContents + dwcbLen);
pstgmed->tymed = TYMED_HGLOBAL; pstgmed->hGlobal = hgFileContents; ASSERT(! pstgmed->pUnkForRelease);
hr = S_OK;
GlobalUnlock(hgFileContents); }
if (hr != S_OK) { GlobalFree(hgFileContents); hgFileContents = NULL; } } } else { hr = DV_E_TYMED; }
ASSERT(IS_VALID_STRUCT_PTR(this, CConfLink)); ASSERT((hr == S_OK && IS_VALID_STRUCT_PTR(pstgmed, CSTGMEDIUM)) || (FAILED(hr) && (EVAL(pstgmed->tymed == TYMED_NULL) && EVAL(! pstgmed->hGlobal) && EVAL(! pstgmed->pUnkForRelease))));
DebugExitHRESULT(CConfLink::TransferFileContents, hr);
return(hr); }
|