@REM ----------------------------------------------------------------- @REM @REM DMDGenericCabber.cmd - Imranp,NSBLD @REM Generic cab script. @REM @REM Copyright (c) Microsoft Corporation. All rights reserved. @REM @REM ----------------------------------------------------------------- @if NOT defined HOST_PROCESSOR_ARCHITECTURE set HOST_PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITECTURE% @perl -x "%~f0" %* @goto :EOF #!perl use lib $ENV{RAZZLETOOLPATH}; use Logmsg; ############################################################################### { # Begin Main Package ############################################################################### # ParseArgs is designed to remap some args to global variables. sub ParseArgs { ## First, handle the usage case if ( ( grep(/-\?/,$ARGV[0]) ) || ( grep(/^$/,$ARGV[0]) ) || ( $#ARGV != 2 ) ) { print " Usage: DMDGenericCabber.cmd CabDirectory OutputCab DeltaOutputName Example: DMDGenericCabber.cmd %_NTTREE%\WMS %_NTTREE%\WMS.cab %_NTTREE%\WMSOCM.* \n"; logmsg( "END Execution" ); exit 0; } ## Return Args. return ( $ARGV[0],$ARGV[1],$ARGV[2] ); } ## End Sub ############################################################################### # ErrorHandler logs error messages for us. sub ErrorHandler { logmsg( " ERROR: $_[0] " ); exit ( 1 ); } ############################################################################### # GetHeader is a function that returns a string[] with a Header approved # by BarbKess for MediaServer -- modified by imranp for Being generic sub GetHeader { ## Declare a header A bit messy. local @lstHeader = ".Option Explicit .Set DiskDirectoryTemplate=DDDD .Set CabinetNameTemplate=ZZZZ .Set CompressionType=LZX .Set MaxDiskSize=CDROM .Set Compress=on .Set Cabinet=on .Set CompressionMemory=21 .Set InfFileName=nul .Set RptFileName=nul "; ## Now, substitute the cab name for ZZZZ my $strRemadeString; $strRemadeString = $_[1] ; ## Break it into tokens my @lstTokensOfFinalCab; @lstTokensOfFinalCab = split ( /\\/,$strRemadeString ); $strRemadeString =~ s/$lstTokensOfFinalCab[$#lstTokensOfFinalCab]//; $strRemadeString =~ s/\\$//; foreach $strPieceOfHeader ( @lstHeader ) { $strPieceOfHeader =~ s/DDDD/$strRemadeString/i; $strPieceOfHeader =~ s/ZZZZ/$lstTokensOfFinalCab[$#lstTokensOfFinalCab]/i; } return ( @lstHeader ); } ########################################################################################################### # RemakeMetaStringAsLiteral takes a metastring ( $.*?\ ) and makes it into an escaped string. sub RemakeMetaStringAsLiteral { local $strInputString; ## remember, pass by value, not reference in this call. $strInputString = $_[0]; local @lstOfMetaChars; ## The list of MetaCharacters I currently know about. push(@lstOfMetaChars,"\\\\"); push(@lstOfMetaChars,"\\\$"); push(@lstOfMetaChars,"\\\."); push(@lstOfMetaChars,"\\\*"); push(@lstOfMetaChars,"\\\?"); push(@lstOfMetaChars,"\\\'"); push(@lstOfMetaChars,"\\\{"); push(@lstOfMetaChars,"\\\}"); foreach my $strMetachar (@lstOfMetaChars) { if ( grep (/$strMetachar/,$strInputString) ) { $strInputString =~ s/$strMetachar/$strMetachar/g; } } return ( $strInputString ); } ############################################################################### # Cleanup Cleans up the directories before doing anything. sub CleanUp { ## Put the parameter into a useful named var my $strDirectoryToClean; $strDirectoryToClean = $_[0]; ## Hard-code a list of bad extensions. my @lstBadExtensions; push( @lstBadExtensions,".cat" ); push( @lstBadExtensions,".cdf" ); push( @lstBadExtensions,".ddf" ); ## Remove any files in the dir with the extensions chomp $strDirectoryToClean; if ( grep(/[a..z]/,$strDirectoryToClean) ) { foreach $strDeleteThisExtension ( @lstBadExtensions ) { my $strDeleteMe = $strDirectoryToClean . '\\*' . $strDeleteThisExtension; print `del /s /q $strDeleteMe`; } } } ############################################################################### # RenameDeltaFiles moves the delta.*, and renames it. sub RenameDeltaFiles { my $strDeltaHere,$strDeltaProcess; ($strDeltaHere,$strDeltaProcess) = ($_[0],$_[1]); ## Take the filename, and make it into a token list, remove the final token from the string. my @lstTokensOfFinalDelta; @lstTokensOfFinalDelta = split ( /\\/,$strDeltaProcess ); $strDeltaProcess =~ s/$lstTokensOfFinalDelta[$#lstTokensOfFinalDelta]//; $strDeltaProcess =~ s/\\$//; ## Actually rename the file here. chomp $lstTokensOfFinalDelta[$#lstTokensOfFinalDelta]; print `pushd $strDeltaHere & rename delta.* $lstTokensOfFinalDelta[$#lstTokensOfFinalDelta] & popd`; ## Now, move the files to the location specified as part of the arguments. print `pushd $strDeltaHere & move $lstTokensOfFinalDelta[$#lstTokensOfFinalDelta] $strDeltaProcess & popd`; } ############################################################################### # CreateFile is a generic file procedure. # Parameters: # Code1, Code2, FileName, Data. # Code1 = AppendCode (0 = overwrite, 1 = append) # Code2 = AttribCode (0 = R/W, 1 = R/O, 2+ = undef) sub CreateFile { local $nAppendCode,$nAttribCode,$strFile,@lstData; $nAppendCode=shift @_; $nAttribCode=shift @_; $strFile=shift@_; @lstData=@_; if ( $nAppendCode==0 ) { open(HANDLE,">$strFile") || ErrorHandler "Could not open file $strFile for write"; foreach $strDatum (@lstData) { print HANDLE $strDatum; } close HANDLE; } elsif ( $nAppendCode==1 ) { open(HANDLE,">>$strFile") || ErrorHandler "Could not open file $strFile for append."; foreach $strDatum (@lstData) { print HANDLE $strDatum; } close HANDLE; } if ( $nAttribCode == 0 ) { } elsif ( $nAttribCode == 1 ) { `attrib +r $strFile`; } } ############################################################################### ## void main() { logmsg( "BEGIN Execution" ); local $g_strOutPutDirectory,$g_strOutPutCab,$g_strRenameDelta; ( $g_strOutPutDirectory,$g_strOutPutCab,$g_strRenameDelta ) = ParseArgs(); ## Get the header made. my @lstGeneratedHeader; @lstGeneratedHeader = GetHeader( $g_strOutPutDirectory,$g_strOutPutCab ); ## Since we might do incrementals, let's be paranoid CleanUp( $g_strOutPutDirectory ); ## Get the list of files in the directory my @lstFilesInDirectory; @lstFilesInDirectory = `dir /s /a-d /b $g_strOutPutDirectory 2>&1`; ## Add Begin and end quotes to each line. foreach $strAddQuotesToMe ( @lstFilesInDirectory ) { chomp $strAddQuotesToMe; $strAddQuotesToMe = '"' . $strAddQuotesToMe . '"' ."\n"; } ## merge this together local @lstDDFFile; @lstDDFFile = @lstGeneratedHeader; push( @lstDDFFile,@lstFilesInDirectory ); ## Now, let's sign the sucker. logmsg( "Calling deltacat" ); print `$ENV{'RAZZLETOOLPATH'}\\deltacat.cmd $g_strOutPutDirectory`; RenameDeltaFiles( $g_strOutPutDirectory,$g_strRenameDelta ); ## Now, let's go out and flush the DDF. my @lstTemp,$strDDFName; @lstTemp = split( /\\/,$g_strOutPutCab ); $strDDFName = $lstTemp[$#lstTemp]; $strDDFName =~ s/\.cab/.ddf/; if ( grep(/\\$/,$g_strOutPutDirectory) ) { $strDDFName = $g_strOutPutDirectory . $strDDFName; } else { $strDDFName = $g_strOutPutDirectory . '\\' . $strDDFName; } CreateFile( 0,0,$strDDFName,@lstDDFFile ); ## Begin Cabbing logmsg ( "Begin Cabbing $strDDFName" ); `$ENV{'RAZZLETOOLPATH'}\\$ENV{'HOST_PROCESSOR_ARCHITECTURE'}\\makecab.exe /f $strDDFName`; if ( -f $g_strOutPutCab ) { logmsg( "Complete Execution" ); } else { ErrorHandler( "Failed to create $g_strOutPutCab" ); } } ################################################################################ } ## end main package