windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/srcdescr.c
2020-09-26 16:20:57 +08:00

241 lines
5.7 KiB
C

#include "precomp.h"
#pragma hdrstop
/*
** Purpose:
** Allocates a new SDLE record from memory.
** Arguments:
** none
** Returns:
** non-Null empty SDLE if successful; Null otherwise (OOM).
**
*********************************************************************/
PSDLE APIENTRY PsdleAlloc()
{
PSDLE psdle;
if ((psdle = (PSDLE)SAlloc((CB)sizeof(SDLE))) != (PSDLE)NULL)
{
psdle->psdleNext = (PSDLE)NULL;
psdle->did = (DID)0;
psdle->didGlobal = (DID)0;
psdle->szLabel = (SZ)NULL;
psdle->szTagFile = (SZ)NULL;
psdle->szNetPath = (SZ)NULL;
}
return(psdle);
}
/*
** Purpose:
** Frees a previously allocated SDLE record.
** Arguments:
** none
** Returns:
** fTrue if successful; fFalse otherwise.
**
*********************************************************************/
BOOL APIENTRY FFreePsdle(PSDLE psdle)
{
ChkArg(psdle != (PSDLE)NULL, 1, fFalse);
if(psdle->szLabel) {
SFree(psdle->szLabel);
}
if(psdle->szTagFile) {
SFree(psdle->szTagFile);
}
if(psdle->szNetPath) {
SFree(psdle->szNetPath);
}
SFree(psdle);
return(fTrue);
}
/*
** Purpose:
** Finds the [Source Media Descriptions] section of the INF File, and
** fills the Source Description List.
** Arguments:
** none
** Notes:
** Requires that the memory INF has been properly initialized.
** Returns:
** grcOkay if successful; grcOutOfMemory or grcINFSrcDescrSect otherwise.
**
*********************************************************************/
GRC APIENTRY GrcFillSrcDescrListFromInf()
{
PPSDLE ppsdle;
GRC grc = grcINFSrcDescrSect;
RGSZ rgsz = (RGSZ)NULL;
SZ szKey = (SZ)NULL;
INT Line;
PINFPERMINFO pPermInfo = pLocalInfPermInfo();
PreCondInfOpen(grcNotOkay);
EvalAssert(pPermInfo->psdleHead == (PSDLE)NULL ||
FFreeSrcDescrList(pPermInfo));
Assert(pPermInfo->psdleHead == (PSDLE)NULL &&
pPermInfo->psdleCur == (PSDLE)NULL);
ppsdle = &(pPermInfo->psdleHead);
if((Line = FindFirstLineFromInfSection("Source Media Descriptions")) == -1)
goto LSrcDescrErr;
do {
UINT cFields;
USHORT iTag = 0, iNet = 0;
DID did;
if (!FKeyInInfLine(Line) ||
((cFields = CFieldsInInfLine(Line)) != 1 &&
cFields != 4 &&
cFields != 7))
goto LSrcDescrErr;
if ((rgsz = RgszFromInfScriptLine(Line,cFields)) == (RGSZ)NULL ||
(szKey = SzGetNthFieldFromInfLine(Line,0)) == (SZ)NULL)
{
grc = grcOutOfMemory;
goto LSrcDescrErr;
}
if ((did = (DID)atoi(szKey)) < didMin ||
did > didMost ||
PsdleFromDid(did, pPermInfo) != (PSDLE)NULL)
goto LSrcDescrErr;
SFree(szKey);
szKey = (SZ)NULL;
if (cFields == 4 ||
cFields == 7)
{
if (CrcStringCompare(rgsz[2], "=") != crcEqual)
goto LSrcDescrErr;
else if (CrcStringCompare(rgsz[1], "TAGFILE") == crcEqual)
iTag = 3;
else if (CrcStringCompare(rgsz[1], "NETPATH") == crcEqual)
iNet = 3;
else
goto LSrcDescrErr;
}
if (cFields == 7)
{
if (CrcStringCompare(rgsz[5], "=") != crcEqual)
goto LSrcDescrErr;
else if (iTag == 0 &&
CrcStringCompare(rgsz[4], "TAGFILE") == crcEqual)
iTag = 6;
else if (iNet == 0 &&
CrcStringCompare(rgsz[4], "NETPATH") == crcEqual)
iNet = 6;
else
goto LSrcDescrErr;
Assert(iTag != 0 &&
iNet != 0);
}
if ((*ppsdle = PsdleAlloc()) == (PSDLE)NULL ||
((*ppsdle)->szLabel = SzDupl(rgsz[0])) == (SZ)NULL ||
(iTag != 0 &&
((*ppsdle)->szTagFile = SzDupl(rgsz[iTag])) == (SZ)NULL) ||
(iNet != 0 &&
((*ppsdle)->szNetPath = SzDupl(rgsz[iNet])) == (SZ)NULL))
{
grc = grcOutOfMemory;
goto LSrcDescrErr;
}
SFree(rgsz);
rgsz = (RGSZ)NULL;
(*ppsdle)->did = did;
ppsdle = &((*ppsdle)->psdleNext);
Assert(pPermInfo->psdleHead != (PSDLE)NULL);
pPermInfo->psdleCur = pPermInfo->psdleHead;
Assert(*ppsdle == (PSDLE)NULL);
} while ((Line = FindNextLineFromInf(Line)) != -1);
pPermInfo->psdleCur = pPermInfo->psdleHead;
return(grcOkay);
LSrcDescrErr:
if (szKey != (SZ)NULL)
SFree(szKey);
if (rgsz != (RGSZ)NULL)
EvalAssert(FFreeRgsz(rgsz));
EvalAssert(FFreeSrcDescrList(pPermInfo));
return(grc);
}
/*
** Purpose:
** Frees each element in the Source Description List.
** Arguments:
** none
** Returns:
** fTrue if successful; fFalse otherwise.
**
*********************************************************************/
BOOL APIENTRY FFreeSrcDescrList( PINFPERMINFO pPermInfo)
{
while ((pPermInfo->psdleCur = pPermInfo->psdleHead) != (PSDLE)NULL)
{
pPermInfo->psdleHead = pPermInfo->psdleCur->psdleNext;
EvalAssert(FFreePsdle(pPermInfo->psdleCur));
}
return(fTrue);
}
/*
** Purpose:
** Search for a corresponding Source Description List Element.
** Arguments:
** did: did to search for.
** Notes:
** Requires that the Source Description List was initialized with a
** successful call to GrcFillSrcDescrListFromInf().
** Returns:
** non-Null SDLE if successful; Null otherwise (not in list).
**
*********************************************************************/
PSDLE APIENTRY PsdleFromDid(DID did, PINFPERMINFO pPermInfo)
{
ChkArg(did >= didMin &&
did <= didMost, 1, (PSDLE)NULL);
if (pPermInfo->psdleHead == (PSDLE)NULL)
return((PSDLE)NULL);
Assert(pPermInfo->psdleCur != (PSDLE)NULL);
if (pPermInfo->psdleCur->did == did)
return(pPermInfo->psdleCur);
pPermInfo->psdleCur = pPermInfo->psdleHead;
while (pPermInfo->psdleCur != (PSDLE)NULL && pPermInfo->psdleCur->did != did)
pPermInfo->psdleCur = pPermInfo->psdleCur->psdleNext;
return(pPermInfo->psdleCur);
}