Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

432 lines
15 KiB

// 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/[email protected]"
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;
}