mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[USETUP]
- Optimize cabinet file processing by finding files sequentially instead of starting from the beginning each time svn path=/trunk/; revision=54624
This commit is contained in:
parent
417b739dbe
commit
ffcd78f426
3 changed files with 42 additions and 30 deletions
|
@ -693,6 +693,23 @@ CabinetFindFirst(PWCHAR FileName,
|
||||||
return CabinetFindNext(Search);
|
return CabinetFindNext(Search);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Finds the next file in the cabinet that matches a search criteria
|
||||||
|
* ARGUMENTS:
|
||||||
|
* FileName = Pointer to search criteria
|
||||||
|
* Search = Pointer to search structure
|
||||||
|
* RETURNS:
|
||||||
|
* Status of operation
|
||||||
|
*/
|
||||||
|
ULONG
|
||||||
|
CabinetFindNextFileSequential(PWCHAR FileName,
|
||||||
|
PCAB_SEARCH Search)
|
||||||
|
{
|
||||||
|
DPRINT("CabinetFindNextFileSequential( FileName = %S )\n", FileName);
|
||||||
|
wcsncpy(Search->Search, FileName, MAX_PATH);
|
||||||
|
return CabinetFindNext(Search);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Finds next file in the cabinet that matches a search criteria
|
* FUNCTION: Finds next file in the cabinet that matches a search criteria
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
|
@ -703,7 +720,6 @@ CabinetFindFirst(PWCHAR FileName,
|
||||||
ULONG
|
ULONG
|
||||||
CabinetFindNext(PCAB_SEARCH Search)
|
CabinetFindNext(PCAB_SEARCH Search)
|
||||||
{
|
{
|
||||||
ULONG Status;
|
|
||||||
PCFFILE Prev;
|
PCFFILE Prev;
|
||||||
ANSI_STRING AnsiString;
|
ANSI_STRING AnsiString;
|
||||||
UNICODE_STRING UnicodeString;
|
UNICODE_STRING UnicodeString;
|
||||||
|
@ -766,33 +782,9 @@ CabinetFindNext(PCAB_SEARCH Search)
|
||||||
Search->Index++;
|
Search->Index++;
|
||||||
if (Search->Index >= PCABHeader->FileCount)
|
if (Search->Index >= PCABHeader->FileCount)
|
||||||
{
|
{
|
||||||
/* we have reached the end of this cabinet, try to open the next */
|
/* we have reached the end of this cabinet */
|
||||||
DPRINT("End of cabinet reached\n");
|
DPRINT("End of cabinet reached\n");
|
||||||
if (wcslen(DiskNext) > 0)
|
return CAB_STATUS_NOFILE;
|
||||||
{
|
|
||||||
CloseCabinet();
|
|
||||||
|
|
||||||
CabinetSetCabinetName(CabinetNext);
|
|
||||||
wcscpy(Search->Cabinet, CabinetName);
|
|
||||||
|
|
||||||
if (DiskChangeHandler != NULL)
|
|
||||||
{
|
|
||||||
DiskChangeHandler(CabinetNext, DiskNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = CabinetOpen();
|
|
||||||
if (Status != CAB_STATUS_SUCCESS)
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return CAB_STATUS_NOFILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* starting new search or cabinet */
|
|
||||||
Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset);
|
|
||||||
Search->Index = 0;
|
|
||||||
Prev = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Search->File = (PCFFILE)(strchr((char *)(Search->File + 1), 0) + 1);
|
Search->File = (PCFFILE)(strchr((char *)(Search->File + 1), 0) + 1);
|
||||||
|
|
|
@ -191,8 +191,10 @@ ULONG CabinetOpen(VOID);
|
||||||
VOID CabinetClose(VOID);
|
VOID CabinetClose(VOID);
|
||||||
/* Locates the first file in the current cabinet file that matches a search criteria */
|
/* Locates the first file in the current cabinet file that matches a search criteria */
|
||||||
ULONG CabinetFindFirst(PWCHAR FileName, PCAB_SEARCH Search);
|
ULONG CabinetFindFirst(PWCHAR FileName, PCAB_SEARCH Search);
|
||||||
/* Locates the next file in the current cabinet file */
|
/* Locates the next file that matches the current search criteria */
|
||||||
ULONG CabinetFindNext(PCAB_SEARCH Search);
|
ULONG CabinetFindNext(PCAB_SEARCH Search);
|
||||||
|
/* Locates the next file in the current cabinet file sequentially */
|
||||||
|
ULONG CabinetFindNextFileSequential(PWCHAR FileName, PCAB_SEARCH Search);
|
||||||
/* Extracts a file from the current cabinet file */
|
/* Extracts a file from the current cabinet file */
|
||||||
ULONG CabinetExtractFile(PCAB_SEARCH Search);
|
ULONG CabinetExtractFile(PCAB_SEARCH Search);
|
||||||
/* Select codec engine to use */
|
/* Select codec engine to use */
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
|
|
||||||
static BOOLEAN HasCurrentCabinet = FALSE;
|
static BOOLEAN HasCurrentCabinet = FALSE;
|
||||||
static WCHAR CurrentCabinetName[MAX_PATH];
|
static WCHAR CurrentCabinetName[MAX_PATH];
|
||||||
|
static CAB_SEARCH Search;
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SetupCreateDirectory(PWCHAR DirectoryName)
|
SetupCreateDirectory(PWCHAR DirectoryName)
|
||||||
|
@ -275,7 +276,6 @@ SetupExtractFile(PWCHAR CabinetFileName,
|
||||||
PWCHAR DestinationPathName)
|
PWCHAR DestinationPathName)
|
||||||
{
|
{
|
||||||
ULONG CabStatus;
|
ULONG CabStatus;
|
||||||
CAB_SEARCH Search;
|
|
||||||
|
|
||||||
DPRINT("SetupExtractFile(CabinetFileName %S, SourceFileName %S, DestinationPathName %S)\n",
|
DPRINT("SetupExtractFile(CabinetFileName %S, SourceFileName %S, DestinationPathName %S)\n",
|
||||||
CabinetFileName, SourceFileName, DestinationPathName);
|
CabinetFileName, SourceFileName, DestinationPathName);
|
||||||
|
@ -288,6 +288,16 @@ SetupExtractFile(PWCHAR CabinetFileName,
|
||||||
if ((HasCurrentCabinet) && (wcscmp(CabinetFileName, CurrentCabinetName) == 0))
|
if ((HasCurrentCabinet) && (wcscmp(CabinetFileName, CurrentCabinetName) == 0))
|
||||||
{
|
{
|
||||||
DPRINT("Using same cabinet as last time\n");
|
DPRINT("Using same cabinet as last time\n");
|
||||||
|
|
||||||
|
/* Use our last location because the files should be sequential */
|
||||||
|
CabStatus = CabinetFindNextFileSequential(SourceFileName, &Search);
|
||||||
|
if (CabStatus != CAB_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("Sequential miss on file: %S\n", SourceFileName);
|
||||||
|
|
||||||
|
/* Looks like we got unlucky */
|
||||||
|
CabStatus = CabinetFindFirst(SourceFileName, &Search);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -315,10 +325,18 @@ SetupExtractFile(PWCHAR CabinetFileName,
|
||||||
DPRINT("Cannot open cabinet (%d)\n", CabStatus);
|
DPRINT("Cannot open cabinet (%d)\n", CabStatus);
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We have to start at the beginning here */
|
||||||
|
CabStatus = CabinetFindFirst(SourceFileName, &Search);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CabStatus != CAB_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT1("Unable to find '%S' in cabinet '%S'\n", SourceFileName, CabinetGetCabinetName());
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
CabinetSetDestinationPath(DestinationPathName);
|
CabinetSetDestinationPath(DestinationPathName);
|
||||||
CabinetFindFirst( SourceFileName, &Search );
|
|
||||||
CabStatus = CabinetExtractFile(&Search);
|
CabStatus = CabinetExtractFile(&Search);
|
||||||
if (CabStatus != CAB_STATUS_SUCCESS)
|
if (CabStatus != CAB_STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue