433 lines
15 KiB
C++
433 lines
15 KiB
C++
|
// File: wabme.cpp
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
#include "wabme.h"
|
||
|
#include "wabtags.h"
|
||
|
#include "wabiab.h"
|
||
|
|
||
|
BOOL GetKeyDataForProp(long nmProp, HKEY * phkey, LPTSTR * ppszSubKey, LPTSTR * ppszValue, BOOL *pfString)
|
||
|
{
|
||
|
// Default to ULS registry key
|
||
|
*phkey = HKEY_CURRENT_USER;
|
||
|
*ppszSubKey = ISAPI_KEY "\\" REGKEY_USERDETAILS;
|
||
|
*pfString = TRUE;
|
||
|
|
||
|
switch (nmProp)
|
||
|
{
|
||
|
default:
|
||
|
WARNING_OUT(("GetKeyDataForProp - invalid argument %d", nmProp));
|
||
|
return FALSE;
|
||
|
|
||
|
case NM_SYSPROP_EMAIL_NAME: *ppszValue = REGVAL_ULS_EMAIL_NAME; break;
|
||
|
case NM_SYSPROP_SERVER_NAME: *ppszValue = REGVAL_SERVERNAME; break;
|
||
|
case NM_SYSPROP_RESOLVE_NAME: *ppszValue = REGVAL_ULS_RES_NAME; break;
|
||
|
case NM_SYSPROP_FIRST_NAME: *ppszValue = REGVAL_ULS_FIRST_NAME; break;
|
||
|
case NM_SYSPROP_LAST_NAME: *ppszValue = REGVAL_ULS_LAST_NAME; break;
|
||
|
case NM_SYSPROP_USER_NAME: *ppszValue = REGVAL_ULS_NAME; break;
|
||
|
case NM_SYSPROP_USER_LOCATION: *ppszValue = REGVAL_ULS_LOCATION_NAME; break;
|
||
|
case NM_SYSPROP_USER_COMMENTS: *ppszValue = REGVAL_ULS_COMMENTS_NAME; break;
|
||
|
|
||
|
} /* switch (nmProp) */
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* W A B R E A D M E */
|
||
|
/*-------------------------------------------------------------------------
|
||
|
%%Function: WabReadMe
|
||
|
|
||
|
Prep the NetMeeting registry settings with the data from the WAB "Me" entry.
|
||
|
This function is also used by the main UI wizard.
|
||
|
-------------------------------------------------------------------------*/
|
||
|
int WabReadMe(void)
|
||
|
{
|
||
|
CWABME * pWab = new CWABME;
|
||
|
if (NULL == pWab)
|
||
|
return FALSE;
|
||
|
|
||
|
HRESULT hr = pWab->ReadMe();
|
||
|
|
||
|
delete pWab;
|
||
|
|
||
|
return SUCCEEDED(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
/* R E A D M E */
|
||
|
/*-------------------------------------------------------------------------
|
||
|
%%Function: ReadMe
|
||
|
|
||
|
Read the WAB data, if it exists (but don't create a default "ME")
|
||
|
-------------------------------------------------------------------------*/
|
||
|
HRESULT CWABME::ReadMe(void)
|
||
|
{
|
||
|
if (NULL == m_pWabObject)
|
||
|
{
|
||
|
return E_FAIL; // no wab installed?
|
||
|
}
|
||
|
|
||
|
SBinary eid;
|
||
|
HRESULT hr = m_pWabObject->GetMe(m_pAdrBook, AB_NO_DIALOG | WABOBJECT_ME_NOCREATE, NULL, &eid, 0);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
ULONG ulObjType = 0;
|
||
|
LPMAPIPROP pMapiProp = NULL;
|
||
|
hr = m_pAdrBook->OpenEntry(eid.cb, (LPENTRYID) eid.lpb, NULL, 0,
|
||
|
&ulObjType, (LPUNKNOWN *)&pMapiProp);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (NULL != pMapiProp)
|
||
|
{
|
||
|
EnsurePropTags(pMapiProp);
|
||
|
|
||
|
UpdateRegEntry(pMapiProp, NM_SYSPROP_EMAIL_NAME, PR_EMAIL_ADDRESS);
|
||
|
UpdateRegEntry(pMapiProp, NM_SYSPROP_FIRST_NAME, PR_GIVEN_NAME);
|
||
|
UpdateRegEntry(pMapiProp, NM_SYSPROP_LAST_NAME, PR_SURNAME);
|
||
|
UpdateRegEntry(pMapiProp, NM_SYSPROP_USER_NAME, PR_DISPLAY_NAME);
|
||
|
UpdateRegEntry(pMapiProp, NM_SYSPROP_USER_LOCATION, PR_LOCALITY);
|
||
|
UpdateRegEntry(pMapiProp, NM_SYSPROP_USER_COMMENTS, PR_COMMENT);
|
||
|
|
||
|
UpdateRegEntryCategory(pMapiProp);
|
||
|
UpdateRegEntryServer(pMapiProp);
|
||
|
|
||
|
pMapiProp->Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/* U P D A T E R E G E N T R Y */
|
||
|
/*-------------------------------------------------------------------------
|
||
|
%%Function: UpdateRegEntry
|
||
|
|
||
|
-------------------------------------------------------------------------*/
|
||
|
HRESULT CWABME::UpdateRegEntry(LPMAPIPROP pMapiProp, NM_SYSPROP nmProp, ULONG uProp)
|
||
|
{
|
||
|
HKEY hkey;
|
||
|
LPTSTR pszSubKey;
|
||
|
LPTSTR pszValue;
|
||
|
BOOL fString;
|
||
|
ULONG cValues;
|
||
|
LPSPropValue pData;
|
||
|
|
||
|
SPropTagArray prop;
|
||
|
prop.cValues = 1;
|
||
|
prop.aulPropTag[0] = uProp;
|
||
|
|
||
|
HRESULT hr = pMapiProp->GetProps(&prop, 0, &cValues, &pData);
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
if ((1 == cValues) && !FEmptySz(pData->Value.lpszA))
|
||
|
{
|
||
|
if (GetKeyDataForProp(nmProp, &hkey, &pszSubKey, &pszValue, &fString))
|
||
|
{
|
||
|
ASSERT((HKEY_CURRENT_USER == hkey) && fString);
|
||
|
RegEntry re(pszSubKey, hkey);
|
||
|
re.SetValue(pszValue, pData->Value.lpszA);
|
||
|
WARNING_OUT(("Updated - %s to [%s]", pszValue, pData->Value.lpszA));
|
||
|
}
|
||
|
}
|
||
|
m_pWabObject->FreeBuffer(pData);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Update the user's server and resolved names in the registry
|
||
|
// based on the "ME" data
|
||
|
HRESULT CWABME::UpdateRegEntryServer(LPMAPIPROP pMapiProp)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
HKEY hkey;
|
||
|
LPTSTR pszSubKey;
|
||
|
LPTSTR pszValue;
|
||
|
BOOL fString;
|
||
|
ULONG cValues;
|
||
|
LPSPropValue pData;
|
||
|
|
||
|
SPropTagArray propTag;
|
||
|
propTag.cValues = 1;
|
||
|
propTag.aulPropTag[0] = Get_PR_NM_DEFAULT();
|
||
|
|
||
|
ULONG iDefault = 0; // the default server
|
||
|
hr = pMapiProp->GetProps(&propTag, 0, &cValues, &pData);
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
iDefault = pData->Value.ul;
|
||
|
m_pWabObject->FreeBuffer(pData);
|
||
|
}
|
||
|
|
||
|
// ILS server data is in an array of strings like "callto://server/email@address"
|
||
|
propTag.aulPropTag[0] = Get_PR_NM_ADDRESS();
|
||
|
hr = pMapiProp->GetProps(&propTag, 0, &cValues, &pData);
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
SLPSTRArray * pMVszA = &(pData->Value.MVszA);
|
||
|
if ((0 != cValues) && (0 != pMVszA->cValues))
|
||
|
{
|
||
|
ASSERT(iDefault < pMVszA->cValues);
|
||
|
LPCTSTR pszAddr = pMVszA->lppszA[iDefault];
|
||
|
pszAddr = PszSkipCallTo(pszAddr);
|
||
|
|
||
|
// Resolve Name is "server/email@address"
|
||
|
if (GetKeyDataForProp(NM_SYSPROP_RESOLVE_NAME, &hkey, &pszSubKey, &pszValue, &fString))
|
||
|
{
|
||
|
ASSERT((HKEY_CURRENT_USER == hkey) && fString);
|
||
|
RegEntry re(pszSubKey, hkey);
|
||
|
re.SetValue(pszValue, pszAddr);
|
||
|
WARNING_OUT(("Updated - %s to [%s]", pszValue, pszAddr));
|
||
|
}
|
||
|
|
||
|
LPCTSTR pszSlash = _StrChr(pszAddr, _T('/'));
|
||
|
if (NULL != pszSlash)
|
||
|
{
|
||
|
pszSlash++;
|
||
|
TCHAR szServer[CCHMAXSZ_SERVER];
|
||
|
lstrcpyn(szServer, pszAddr, (int)min(CCHMAX(szServer), pszSlash - pszAddr));
|
||
|
if (GetKeyDataForProp(NM_SYSPROP_SERVER_NAME, &hkey, &pszSubKey, &pszValue, &fString))
|
||
|
{
|
||
|
ASSERT((HKEY_CURRENT_USER == hkey) && fString);
|
||
|
RegEntry re(pszSubKey, hkey);
|
||
|
re.SetValue(pszValue, szServer);
|
||
|
WARNING_OUT(("Updated - %s to [%s]", pszValue, szServer));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
m_pWabObject->FreeBuffer(pData);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Update the user's category in the registry
|
||
|
// based on the WAB value for the "ME" NetMeeting user category
|
||
|
HRESULT CWABME::UpdateRegEntryCategory(LPMAPIPROP pMapiProp)
|
||
|
{
|
||
|
HKEY hkey;
|
||
|
LPTSTR pszSubKey;
|
||
|
LPTSTR pszValue;
|
||
|
BOOL fString;
|
||
|
ULONG cValues;
|
||
|
LPSPropValue pData;
|
||
|
|
||
|
SPropTagArray prop;
|
||
|
prop.cValues = 1;
|
||
|
prop.aulPropTag[0] = Get_PR_NM_CATEGORY();
|
||
|
|
||
|
HRESULT hr = pMapiProp->GetProps(&prop, 0, &cValues, &pData);
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
if (1 == cValues)
|
||
|
{
|
||
|
if (GetKeyDataForProp(NM_SYSPROP_USER_CATEGORY, &hkey, &pszSubKey, &pszValue, &fString))
|
||
|
{
|
||
|
ASSERT((HKEY_CURRENT_USER == hkey) && !fString);
|
||
|
RegEntry re(pszSubKey, hkey);
|
||
|
re.SetValue(pszValue, pData->Value.l);
|
||
|
WARNING_OUT(("Updated - category to %d", pData->Value.l));
|
||
|
}
|
||
|
}
|
||
|
m_pWabObject->FreeBuffer(pData);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* W A B W R I T E M E */
|
||
|
/*-------------------------------------------------------------------------
|
||
|
%%Function: WabWriteMe
|
||
|
|
||
|
Write the current NM settings to the WAB "Me" entry.
|
||
|
This function is also used by the main UI wizard.
|
||
|
-------------------------------------------------------------------------*/
|
||
|
int WabWriteMe(void)
|
||
|
{
|
||
|
CWABME * pWab = new CWABME;
|
||
|
if (NULL == pWab)
|
||
|
return FALSE;
|
||
|
|
||
|
HRESULT hr = pWab->WriteMe();
|
||
|
|
||
|
delete pWab;
|
||
|
|
||
|
return SUCCEEDED(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
/* W R I T E M E */
|
||
|
/*-------------------------------------------------------------------------
|
||
|
%%Function: WriteMe
|
||
|
|
||
|
Write the "ME" data only if no entry already exists.
|
||
|
-------------------------------------------------------------------------*/
|
||
|
HRESULT CWABME::WriteMe(void)
|
||
|
{
|
||
|
return( S_OK );
|
||
|
|
||
|
if (NULL == m_pWabObject)
|
||
|
{
|
||
|
return E_FAIL; // no wab installed?
|
||
|
}
|
||
|
|
||
|
SBinary eid;
|
||
|
HRESULT hr = m_pWabObject->GetMe(m_pAdrBook, AB_NO_DIALOG, NULL, &eid, 0);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
ULONG ulObjType = 0;
|
||
|
LPMAPIPROP pMapiProp = NULL;
|
||
|
hr = m_pAdrBook->OpenEntry(eid.cb, (LPENTRYID) eid.lpb, NULL, MAPI_MODIFY,
|
||
|
&ulObjType, (LPUNKNOWN *)&pMapiProp);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (NULL != pMapiProp)
|
||
|
{
|
||
|
EnsurePropTags(pMapiProp);
|
||
|
|
||
|
UpdateProp(pMapiProp, NM_SYSPROP_FIRST_NAME, PR_GIVEN_NAME);
|
||
|
UpdateProp(pMapiProp, NM_SYSPROP_LAST_NAME, PR_SURNAME);
|
||
|
UpdateProp(pMapiProp, NM_SYSPROP_USER_NAME, PR_DISPLAY_NAME);
|
||
|
UpdateProp(pMapiProp, NM_SYSPROP_USER_CITY, PR_LOCALITY); // Business
|
||
|
UpdateProp(pMapiProp, NM_SYSPROP_USER_CITY, PR_HOME_ADDRESS_CITY); // Personal
|
||
|
UpdateProp(pMapiProp, NM_SYSPROP_USER_COMMENTS, PR_COMMENT);
|
||
|
|
||
|
UpdatePropServer(pMapiProp);
|
||
|
|
||
|
hr = pMapiProp->SaveChanges(FORCE_SAVE);
|
||
|
pMapiProp->Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/* U P D A T E P R O P */
|
||
|
/*-------------------------------------------------------------------------
|
||
|
%%Function: UpdateProp
|
||
|
|
||
|
Update a WAB properly based on the corresponding registry string.
|
||
|
-------------------------------------------------------------------------*/
|
||
|
HRESULT CWABME::UpdateProp(LPMAPIPROP pMapiProp, NM_SYSPROP nmProp, ULONG uProp)
|
||
|
{
|
||
|
HKEY hkey;
|
||
|
LPTSTR pszSubKey;
|
||
|
LPTSTR pszValue;
|
||
|
BOOL fString;
|
||
|
|
||
|
HRESULT hr = GetKeyDataForProp(nmProp, &hkey, &pszSubKey, &pszValue, &fString) ? S_OK : E_FAIL;
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
ASSERT((HKEY_CURRENT_USER == hkey) && fString);
|
||
|
RegEntry re(pszSubKey, hkey);
|
||
|
|
||
|
LPTSTR psz = re.GetString(pszValue);
|
||
|
if (!FEmptySz(psz))
|
||
|
{
|
||
|
hr = UpdatePropSz(pMapiProp, uProp, psz, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Update a WAB property to the given string.
|
||
|
// Replace existing data only if fReplace is TRUE
|
||
|
HRESULT CWABME::UpdatePropSz(LPMAPIPROP pMapiProp, ULONG uProp, LPTSTR psz, BOOL fReplace)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
if (!fReplace)
|
||
|
{ // Don't replace existing data
|
||
|
ULONG cValues;
|
||
|
LPSPropValue pData;
|
||
|
|
||
|
SPropTagArray propTag;
|
||
|
propTag.cValues = 1;
|
||
|
propTag.aulPropTag[0] = uProp;
|
||
|
|
||
|
hr = pMapiProp->GetProps(&propTag, 0, &cValues, &pData);
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
if ((1 == cValues) && !FEmptySz(pData->Value.lpszA))
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
m_pWabObject->FreeBuffer(pData);
|
||
|
|
||
|
if (S_OK != hr)
|
||
|
return hr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SPropValue propVal;
|
||
|
propVal.ulPropTag = uProp;
|
||
|
propVal.Value.lpszA = psz;
|
||
|
|
||
|
hr = pMapiProp->SetProps(1, &propVal, NULL);
|
||
|
WARNING_OUT(("Updated - property %08X to [%s]", uProp, propVal.Value.lpszA));
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
static const TCHAR g_pcszSMTP[] = TEXT("SMTP"); // value for PR_ADDRTYPE
|
||
|
|
||
|
// Update the default WAB "callto" information
|
||
|
HRESULT CWABME::UpdatePropServer(LPMAPIPROP pMapiProp)
|
||
|
{
|
||
|
HKEY hkey;
|
||
|
LPTSTR pszSubKey;
|
||
|
LPTSTR pszValue;
|
||
|
BOOL fString;
|
||
|
|
||
|
TCHAR szServer[CCHMAXSZ_SERVER];
|
||
|
GetKeyDataForProp(NM_SYSPROP_SERVER_NAME, &hkey, &pszSubKey, &pszValue, &fString);
|
||
|
RegEntry re(pszSubKey, hkey);
|
||
|
lstrcpyn(szServer, re.GetString(pszValue), CCHMAXSZ_SERVER);
|
||
|
|
||
|
// Save the email address
|
||
|
LPTSTR pszEmail = re.GetString(REGVAL_ULS_EMAIL_NAME);
|
||
|
if (S_OK == UpdatePropSz(pMapiProp, PR_EMAIL_ADDRESS, pszEmail, FALSE))
|
||
|
{
|
||
|
UpdatePropSz(pMapiProp, PR_ADDRTYPE, (LPTSTR) g_pcszSMTP, FALSE);
|
||
|
}
|
||
|
|
||
|
// Create the full "callto://server/foo@bar.com"
|
||
|
TCHAR sz[MAX_PATH*2];
|
||
|
if (!FCreateCallToSz(szServer, pszEmail, sz, CCHMAX(sz)))
|
||
|
return E_OUTOFMEMORY;
|
||
|
|
||
|
LPTSTR psz = sz;
|
||
|
SPropValue propVal;
|
||
|
propVal.ulPropTag = Get_PR_NM_ADDRESS();
|
||
|
propVal.Value.MVszA.cValues = 1;
|
||
|
propVal.Value.MVszA.lppszA = &psz;
|
||
|
|
||
|
HRESULT hr = pMapiProp->SetProps(1, &propVal, NULL);
|
||
|
WARNING_OUT(("Updated - NM server [%s]", sz));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
// Set this as the default
|
||
|
propVal.ulPropTag = Get_PR_NM_DEFAULT();
|
||
|
propVal.Value.ul = 0;
|
||
|
hr = pMapiProp->SetProps(1, &propVal, NULL);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|