windows-nt/Source/XPSP1/NT/net/rras/cm/cmdial/refs.cpp
2020-09-26 16:20:57 +08:00

298 lines
7.2 KiB
C++

//+----------------------------------------------------------------------------
//
// File: refs.cpp
//
// Module: CMDIAL32.DLL
//
// Synopsis: The module contains the code for profile referencing.
//
// Copyright (c) 1996-1999 Microsoft Corporation
//
// Author: quintinb created Header 08/16/99
//
//+----------------------------------------------------------------------------
#include "cmmaster.h"
#include "pbk_str.h"
//+---------------------------------------------------------------------------
//
// Function: ValidTopLevelPBK()
//
// Synopsis: Checks to see if the toplevel phone book is valid.
//
// Arguments: pArgs [the ptr to ArgsStruct]
//
// Returns: BOOL [True if there are valid phone books]
//
// History: henryt Created 4/7/97
//
//----------------------------------------------------------------------------
BOOL ValidTopLevelPBK(
ArgsStruct *pArgs
)
{
LPTSTR pszTmp;
LPTSTR pszFullPath;
BOOL fValid = TRUE;
//
// First check the top level service profile pbk
//
pszTmp = pArgs->piniService->GPPS(c_pszCmSectionIsp, c_pszCmEntryIspPbFile);
if (!*pszTmp)
{
fValid = FALSE;
}
else
{
pszFullPath = CmBuildFullPathFromRelative(pArgs->piniProfile->GetFile(), pszTmp);
if (!pszFullPath || (FALSE == FileExists(pszFullPath)))
{
fValid = FALSE;
}
CmFree(pszFullPath);
}
CmFree(pszTmp);
//
// If PBK failed, we're done
//
if (FALSE == fValid)
{
return fValid;
}
//
// Now check the region file
//
pszTmp = pArgs->piniService->GPPS(c_pszCmSectionIsp, c_pszCmEntryIspRegionFile);
if (!*pszTmp)
{
fValid = FALSE;
}
else
{
pszFullPath = CmBuildFullPathFromRelative(pArgs->piniProfile->GetFile(), pszTmp);
if (!pszFullPath || (FALSE == FileExists(pszFullPath)))
{
fValid = FALSE;
}
CmFree(pszFullPath);
}
CmFree(pszTmp);
return fValid;
}
//+---------------------------------------------------------------------------
//
// Function: ValidReferencedPBKs()
//
// Synopsis: Checks to see if the phone books used by the referenced
// service profile(s) exist.
//
// Arguments: pArgs [the ptr to ArgsStruct]
//
// Returns: BOOL [True if there are valid phone books]
//
// History: henryt Created 4/7/97
//
//----------------------------------------------------------------------------
BOOL ValidReferencedPBKs(
ArgsStruct *pArgs
)
{
LPTSTR pszTmp, pszTmp2;
LPTSTR pszRef, pszNext;
CIni iniRef(g_hInst);
CIni iniFile(g_hInst, pArgs->piniService->GetFile());
LPTSTR pszRefFile;
BOOL fValid = TRUE;
BOOL fValidPairFound = FALSE;
LPTSTR pszFullPath;
//
// Now check the references.
//
pszTmp2 = iniFile.GPPS(c_pszCmSectionIsp, c_pszCmEntryIspReferences);
pszRef = NULL;
pszNext = pszTmp2;
while (1)
{
if (!(pszRef = CmStrtok(pszNext, TEXT(" \t,"))))
{
break;
}
fValid = TRUE;
pszNext = pszRef + lstrlenU(pszRef) + 1;
iniFile.SetEntry(pszRef);
//
// Make sure that each referenced service has a valid pbk and pbr
//
pszRefFile = iniFile.GPPS(c_pszCmSectionIsp, c_pszCmEntryIspCmsFile);
if (*pszRefFile)
{
//
// Ensure a full path to the RefFile
//
pszFullPath = CmBuildFullPathFromRelative(pArgs->piniProfile->GetFile(), pszRefFile);
if (!pszFullPath)
{
fValid = FALSE;
}
else
{
iniRef.SetFile(pszFullPath);
}
CmFree(pszFullPath);
if (fValid)
{
//
// Test existence of phonebook
//
pszTmp = iniRef.GPPS(c_pszCmSectionIsp, c_pszCmEntryIspPbFile);
if (!*pszTmp)
{
fValid = FALSE;
}
else
{
pszFullPath = CmBuildFullPathFromRelative(pArgs->piniProfile->GetFile(), pszTmp);
if (!pszFullPath || (FALSE == FileExists(pszFullPath)))
{
fValid = FALSE;
}
CmFree(pszFullPath);
}
CmFree(pszTmp);
//
// Now check the region file
//
pszTmp = iniRef.GPPS(c_pszCmSectionIsp, c_pszCmEntryIspRegionFile);
if (!*pszTmp)
{
fValid = FALSE;
}
else
{
pszFullPath = CmBuildFullPathFromRelative(pArgs->piniProfile->GetFile(), pszTmp);
if (!pszFullPath || (FALSE == FileExists(pszFullPath)))
{
fValid = FALSE;
}
CmFree(pszFullPath);
}
CmFree(pszTmp);
}
}
else
{
fValid = FALSE;
}
CmFree(pszRefFile);
if (fValid)
{
fValidPairFound = TRUE;
break;
}
}
CmFree(pszTmp2);
return fValidPairFound;
}
//+---------------------------------------------------------------------------
//
// Function: GetAppropriateIniService
//
// Synopsis: Depending on:
// 1. whether we're referencing or not,
// 2. the pbk from which the user selected the phone #
//
// this func creates a CIni obj with the correct cms file
//
// Arguments: pArgs Pointer to ArgsStruct
// dwEntry phone index
//
// Returns: CIni* - the ptr to the new object
//
// History: henryt Created 5/14/97
//----------------------------------------------------------------------------
CIni* GetAppropriateIniService(
ArgsStruct *pArgs,
DWORD dwEntry
)
{
CIni* piniService = new CIni(g_hInst);
if (!piniService)
{
CMTRACE(TEXT("GetAppropriateIniService() : alloc mem failed"));
return NULL;
}
//
// we need to work with the correct service file(the top-level service
// or a referenced service).
//
// according to the spec, we will always use the DUN settings from the cms
// associated w/ the phone book from which the user selected the POP. i.e.
// if the user switches the picked from a different pbk, we need to update
// the RAS connectoid.
//
if (IsBlankString(pArgs->aDialInfo[dwEntry].szPhoneBookFile) ||
lstrcmpiU(pArgs->aDialInfo[dwEntry].szPhoneBookFile, pArgs->piniService->GetFile()) == 0)
{
//
// the user either typed in the phone # or selected a phone # from the
// top level phone book
//
piniService->SetFile(pArgs->piniService->GetFile());
}
else
{
//
// the user picked the phone # from a referenced phone book.
//
piniService->SetFile(pArgs->aDialInfo[dwEntry].szPhoneBookFile);
}
return piniService;
}