298 lines
7.2 KiB
C++
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;
|
||
|
}
|
||
|
|